ES5的繼承
構(gòu)造函數(shù)、原型和實(shí)例的關(guān)系:每一個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象,每一個(gè)原型對(duì)象都有一個(gè)指向構(gòu)造函數(shù)的指針,而每一個(gè)實(shí)例都包含一個(gè)指向原型對(duì)象的內(nèi)部指針,
- 原型鏈實(shí)現(xiàn)繼承:
- 基本思想:利用原型讓一個(gè)引用類型繼承另一個(gè)類型的屬性和方法,即讓原型對(duì)象等于另一個(gè)類型的實(shí)例
- 基本模式:
// 構(gòu)造函數(shù) function Person(name, sex) { this.name = name; this.sex = sex; this.niam= "草擬嗎" this.run=function(){ console.log(this.name+"在奔跑") } } // 定義Person的原型,原型中的屬性可以被自定義對(duì)象引用 Person.prototype = { getName: function() { return this.name; }, getSex: function() { return this.sex; } } Subperson.prototype = new Person() function Subperson(name, sex, color){ this.color = color this.niam= "你阿媽" this.run=function(){ console.log(this.name+"---"+this.color+"還活蹦亂跳") } } let sub = new Subperson("小李","男","黃色的"); console.log(sub.getName()) sub.run() console.log(sub.niam)
輸出:
$ node es5繼承.js
undefined
undefined---黃色的還活蹦亂跳
你阿媽
- 最終總結(jié):Sub指向Subperson的原型,Subperson的原型又指向Person的原型
-
注意事項(xiàng):
別忘記默認(rèn)的原型,所有的引用類型都繼承自O(shè)bject,所有函數(shù)的默認(rèn)原型都是Object的實(shí)例,因此默認(rèn)原型里都有一個(gè)指針,指向object.prototype
謹(jǐn)慎地定義方法,給原型添加方法的代碼一定要放在替換原型的語(yǔ)句之后,不能使用對(duì)象字面量添加原型方法,這樣會(huì)重寫(xiě)原型鏈
-
原型鏈繼承的問(wèn)題
最主要的問(wèn)題來(lái)自包含引用類型值的原型,它會(huì)被所有實(shí)例共享
第二個(gè)問(wèn)題是,創(chuàng)造子類型的實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)
-