理論源於生活、又高於生活
在JS中「繼承」,和現實生活中繼承是類似的
如:兒子繼承父親財產、子女的生理特性有父母的特性(身高、膚色、性格等等....)
只是必定比例上是這樣的,不是絕對的同樣
冒充繼承(也稱之爲借用構造函數)javascript
這種方法實現原理主要是利用了call/apply
// 定義父「類」(ES6以前JS中沒有嚴格意義上的「類」概念) function Parent(name, age) { this.name = name this.age = age this.run = function () { console.log('run...') } } // 定義子」類「 Student.prototype.sid=200 function Student(name, age, sex) { var _super = Parent // call方法強制更改this指向,注意這個方向只是單純的操做當前this對象,並不會影響到其「原型對象」 _super.call(this, name, age) delete _super this.sex=sex } var student=new Student("zs",20,"Male") console.log(student.name) // zs console.log(student.sid) // 200
原型鏈繼承java
// 定義父「類」(ES6以前JS中沒有嚴格意義上的「類」概念) Parent.prototype.lastName='damon' function Parent() { this.lastName='pool' } // 定義子」類「 // 子類的原型指向父類的一個實例對象 Student.prototype=new Parent() function Student() { } var student=new Student() // 查找過程是怎麼樣的? /* 一、首先會在對象student自身身上查找, 二、若是找不到,則到原型上查找,那麼student的原型是誰? student.__proto__===Student.prototype 而Student.prototype=new Student也就是原型如今指向的是父類的實例 三、因此到父類的實例上去查找,若是找不到,再到父類實例的原型上查找 四、若是找不到,則到原型的原型上查找,此時到了Object.prototype身上 Object.prototype.__proto__===null 五、若是找不到,則返回undefined */ console.log(student.lastName) // damon
還沒有寫完整,待續...