1.原型的存在乎義在於實現繼承共享,是在構造函數中定義的一個成員對象,在下次實例化時不須要在構造函數中定義成員 就可實現實例共享方法屬性。函數
例子1:oop
一般爲。 構造函數.prototype.xxx=我想實現實例繼承的東西 -》 new 構造函數 -》新實例a對象.原型指針指向構造函數的xxx對象(引用類型)
例子2:this
Array 不等於 Array() 緣由 Array爲一個函數,而Array()爲一個構造函數調用語句,故Array擁有prototype對象用於實例的共享繼承,Array()產生一個實例 故只能擁有prototype對象的私有指針 proto
2.在使用原型繼承時 不能使用字面量 構造函數.prototype={} 的方式重寫原型對象 。由於會致使該原型對象的constructor屬性被重寫,在生成的實例中致使constructor指向Object而且會切斷以前原型對象的聯繫,破壞原型鏈。prototype
3.JavaScript 主要經過原型鏈實現繼承。原型鏈的構建是經過將一個類型的實例賦值給另外一個構造函數的原型實現的指針
例子3:code
xxx實例.__proto__-》function xxx()構造函數.prototype對象故xxx.__proto__ === xxx.prototypexxx.prototype.__proto__-》Object.prototype由於全部對象都爲Object函數構造來的。故xxx.prototype.__proto__===Object.prototype。對象
Object.prototype.__proto__爲原型鏈頂端__proto__定義了還沒有使用因此爲null故Object.prototype.__proto__===null約定俗成。繼承
1.原型模式有忽略構造函數定義初始值步驟及原型中操做引用類型的缺點。因此須要組合使用構造函數模式+原型模式來建立實例。在構造函數中定義實例的屬性,而需共享的方法就定義在原型對象中。ip
繼承:在子構造函數中調用 父.call(this, name); 實現構造函數之間的屬性繼承。使用 子.prototype = new 父(); 子.prototype.constructor = 子;實現方法的繼承。 原型鏈
2.如要在生產環境下的構造函數新增方法(如Array) 須要使用一個相似於工廠函數的寄生構造函數模式 在構造函數中返回一個修改後的對象
例子:在子類中使用call()能夠實現繼承 function SuperType(name){ this.name = name; } function SubType(){//繼承了 SuperType,同時還傳遞了參數 SuperType.call(this, "Nicholas"); SuperType.call(this, "Nicholas"); //實例屬性 this.age = 29; } var instance = new SubType(); alert(instance.name); //"Nicholas"; alert(instance.age); //29