- 對于JavaScript來說,繼承有兩個要點:
- 復(fù)用父構(gòu)造函數(shù)中的代碼 - 復(fù)用父原型中的代碼第一種實現(xiàn)復(fù)用父構(gòu)造函數(shù)中的代碼,我們可以考慮調(diào)用父構(gòu)造函數(shù)并將 this 綁定到子構(gòu)造函數(shù)。
- 第一種方法:復(fù)用父原型中的代碼,我們只需改變原型鏈即可。將子構(gòu)造函數(shù)的原型對象的 proto 屬性指向父構(gòu)造函數(shù)的原型對象。
- 第二種實現(xiàn):使用 new 操作符來替代直接使用 proto 屬性來改變原型鏈。
- 第三種實現(xiàn):使用一個空構(gòu)造函數(shù)來作為中介函數(shù),這樣就不會將構(gòu)造函數(shù)中的屬性混到 prototype 中 function A(x, y) { this.x = x this.y = y } A.prototype.run = function () { } // 寄生繼承 二者一起使用 function B(x, y) { A.call(this, x, y) // 借用繼承 } B.prototype = new A() // 原型繼承 // 組合繼承 Function.prototype.extends = function (superClass) { function F() { } F.prototype = superClass.prototype if (superClass.prototype.constructor !== superClass) { Object.defineProperty(superClass.prototype, 'constructor', { value: superClass }) } let proto = this.prototype this.prototype = new F() let names = Reflect.ownKeys(proto) for (let i = 0; i < names.length; i++) { let desc = Object.getOwnPropertyDescriptor(proto, names[i]) Object.defineProperty(this.prototypr, name[i], desc) } this.prototype.super = function (arg) { superClass.apply(this, arg) } this.prototype.supers = superClass.prototype }
- 第四種實現(xiàn):es6類的繼承extends。