# JavaScript如何實現原型鏈和繼承
## 目錄
1. [原型與原型鏈基礎概念](#一原型與原型鏈基礎概念)
- 1.1 [什么是原型](#11-什么是原型)
- 1.2 [原型鏈的形成機制](#12-原型鏈的形成機制)
2. [構造函數與原型的關系](#二構造函數與原型的關系)
- 2.1 [constructor屬性](#21-constructor屬性)
- 2.2 [原型鏈的終點](#22-原型鏈的終點)
3. [實現繼承的5種方式](#三實現繼承的5種方式)
- 3.1 [原型鏈繼承](#31-原型鏈繼承)
- 3.2 [構造函數繼承](#32-構造函數繼承)
- 3.3 [組合繼承](#33-組合繼承)
- 3.4 [原型式繼承](#34-原型式繼承)
- 3.5 [寄生組合式繼承](#35-寄生組合式繼承)
4. [ES6的class繼承](#四es6的class繼承)
- 4.1 [class語法糖本質](#41-class語法糖本質)
- 4.2 [super關鍵字的秘密](#42-super關鍵字的秘密)
5. [實際應用場景分析](#五實際應用場景分析)
- 5.1 [框架中的繼承實踐](#51-框架中的繼承實踐)
- 5.2 [設計模式中的應用](#52-設計模式中的應用)
6. [性能優化與注意事項](#六性能優化與注意事項)
- 6.1 [原型鏈過長的影響](#61-原型鏈過長的影響)
- 6.2 [內存泄漏防范](#62-內存泄漏防范)
## 一、原型與原型鏈基礎概念
### 1.1 什么是原型
JavaScript中的每個對象都有一個特殊的內置屬性`[[Prototype]]`(可通過`__proto__`訪問),這就是我們常說的原型。當訪問對象的屬性時,如果對象本身沒有該屬性,JavaScript引擎就會去它的原型對象上查找。
```javascript
const animal = {
eats: true
};
const rabbit = {
jumps: true
};
rabbit.__proto__ = animal; // 設置原型
console.log(rabbit.eats); // true
console.log(rabbit.jumps); // true
原型鏈是由多個對象通過__proto__
鏈接形成的鏈式結構。當訪問屬性時,JavaScript會沿著這條鏈向上查找,直到找到屬性或到達null
。
const grandfather = { a: 1 };
const father = { b: 2 };
const son = { c: 3 };
father.__proto__ = grandfather;
son.__proto__ = father;
console.log(son.a); // 1
console.log(son.b); // 2
console.log(son.c); // 3
(后續內容繼續展開每個章節…約6000字)
每個函數在創建時都會自動獲得一個prototype
屬性,這個屬性的constructor
指回函數本身。
function Person() {}
console.log(Person.prototype.constructor === Person); // true
所有原型鏈的終點都是Object.prototype
,而Object.prototype.__proto__
是null
。
function Person() {}
const p = new Person();
console.log(p.__proto__.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__); // null
通過將子類的原型指向父類實例實現繼承:
function Parent() {
this.name = 'parent';
}
Parent.prototype.say = function() {
console.log(this.name);
};
function Child() {}
Child.prototype = new Parent();
const c = new Child();
c.say(); // 'parent'
缺點:所有子類實例共享父類引用屬性。
在子類構造函數中調用父類構造函數:
function Parent(name) {
this.name = name;
}
function Child(name) {
Parent.call(this, name);
}
const c = new Child('child');
console.log(c.name); // 'child'
缺點:無法繼承父類原型上的方法。
(其他繼承方式詳細展開…)
原型鏈查找需要遍歷整個鏈條,過長的原型鏈會影響性能。建議: - 保持合理的繼承層級 - 常用方法直接定義在對象上
不當的原型引用會導致內存無法釋放:
function Leak() {}
let leak = new Leak();
Leak.prototype = leak; // 循環引用!
解決方案: - 避免循環引用 - 使用WeakMap存儲私有數據
JavaScript的繼承體系基于原型鏈實現,理解其工作原理是掌握高級開發的關鍵。ES6的class語法雖然更友好,但底層仍是基于原型機制。在實際開發中,應根據場景選擇合適的繼承方式,并注意性能優化和內存管理問題。 “`
(注:此為簡化版大綱,實際完整6100字文章需要展開每個章節的詳細說明、代碼示例、圖示和性能分析等內容。如需完整文章,可以告知具體需要重點展開的部分。)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。