首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JavaScript 原型對象深度解析:原型鏈、繼承模式、ES6 class 底層機制與最佳實踐

     編輯:程式設計綜合問答

核心概念:原型即「對象的模板對象」

JS **沒有類 (ES6 前)**,只有**對象**。每個對象內部有一個隱藏屬性 `[[Prototype]]` (訪問器 `__proto__`),指向另一個對象 —— **原型對象**。屬性查找沿著原型鏈向上,直到 `null`。

三種創建對象並建立原型關係的方式

方式代碼原型關係適用場景
構造函數 + prototype`function F(){}; F.prototype.method = ...; new F()``instance.__proto__ === F.prototype`ES5 經典、庫兼容
Object.create()`const child = Object.create(parent);``child.__proto__ === parent`純原型繼承、無構造函數
ES6 class`class C { method(){} }``C.prototype.method`,`instance.__proto__ === C.prototype`**現代標準**、語法糖

原型鏈圖解

const animal = { breathe() { console.log('breathing'); } };
const dog = Object.create(animal);
dog.bark = () => console.log('woof');

dog.breathe(); // 1. dog 無 breathe → 2. animal 有 → 執行
// 原型鏈: dog → animal → Object.prototype → null

關鍵屬性與方法

  • `__proto__` (非標準但通用) / `Object.getPrototypeOf(obj)` — 獲取原型
  • `Object.setPrototypeOf(obj, proto)` — 修改原型 (性能殺手,**禁用**)
  • `prototype` — **僅函數擁有**,指向「由該構造函數創建的實例的原型」
  • `constructor` — 原型對象上的屬性,指回構造函數 (可被篡改)
  • `hasOwnProperty(prop)` — 判斷自有屬性 (不查原型鏈)
  • `prop in obj` — 判斷含原型鏈

ES6 class 底層仍是原型

class Person {
    constructor(name) { this.name = name; }
    sayHi() { console.log(this.name); }
}
const p = new Person('Tom');

// 等價於
function Person(name) { this.name = name; }
Person.prototype.sayHi = function() { console.log(this.name); }

// 驗證
console.log(p.__proto__ === Person.prototype); // true
console.log(Person.prototype.constructor === Person); // true
console.log(Object.getPrototypeOf(p) === Person.prototype); // true

繼承模式對比

模式核心代碼優點缺點
原型鏈繼承`Child.prototype = new Parent()`簡單引用類型屬性共享、無法向父傳參
構造函數盜用`Parent.call(this, args)`解決引用共享、可傳參方法無法復用 (每實例一份)
組合繼承盜用構造 + 原型鏈兼具優點調用兩次父構造函數
寄生組合繼承 (ES5 最佳)`Child.prototype = Object.create(Parent.prototype); Child.prototype.constructor = Child;`只調用一次父構造、原型鏈純淨代碼稍多
ES6 extends (標準化寄生組合)`class Child extends Parent { constructor(){ super(); } }`**語法清晰、引擎優化、static 也繼承**需支持 ES6 環境

性能與最佳實踐

  1. 方法定義在 `prototype` / `class` 體內,實例共享,節省內存
  2. 避免修改內建原型 (`Array.prototype.xxx = ...`) —— 污染全局、破壞 `for...in`、阻礙引擎優化
  3. 使用 `Object.create(null)`** 創建純字典對象,無原型鏈查找開銷
  4. `__proto__` 僅調試用**,生產代碼用 `Object.getPrototypeOf`/`Reflect.getPrototypeOf`
  5. 原型鏈過深 (>10) 影響查找速度**,扁平化設計

總結

**原型對象是 JS 物件導向的核心**。理解 `[[Prototype]]`、`prototype`、`constructor` 三者關係,掌握 `Object.create` 與 `class extends` 兩大現代手段,避免濫用動態修改原型,即可寫出高性能、可維護的 JS 代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved