《JavaScript高級程序設計 第三版》 學習筆記
Object-Oriented 有一個標誌,就是都有類的概念,經過類來建立多個具備相同屬性和方法的對象。而對於 EMCAScript中沒有類的概念,ECMA-262把對象定義爲
」無序屬性的集合,該屬性能夠包含任何基本值,對象或者函數。「函數
每一個函數都有一個prototype(原型)屬性學習
這個屬性都有一個指針,指向一個對象this
這個對象包含由特定類型全部實例共享的屬性和方法spa
使用原型的好處是 可讓全部對象實例共享它包含的方法和屬性.net
經過in操做符和hasOwnProperty來判斷給定屬性是來自於原型仍是實例
in- true 表明屬性在對象中存在 來自實例或者來自原型
hasOwnProperty- true表明屬性來自於實例 是實例屬性prototype
ECMAScript中只支持實現繼承,並且是經過原型鏈的方式來實現的設計
理解原型對象
是這樣的
當咱們建立一個新函數的時候,會根據一組特定的規則爲該函數建立一個prototype
屬性,這個prototype
屬性指向函數的原型對象。在默認狀況下,原型對象都會自動得到一個constructor
(構造函數)屬性,這個屬性包含包含一個指向prototype屬性所在函數的指針。
因此關係就是
好比有一個Person的對象
Person.prototype => 原型對象
原型對象.constructor => Person
即 Person.prototype.constructor == Person
見下圖關係
指針
將原型鏈做爲實現繼承的主要方法,基本思想是利用原型讓一個引用類型繼承另外一個引用類型的屬性和方法。
demo代碼code
function SuperType(){ this.property = true; } SuperType.prototype.getSuperValue = function(){ return this.property; } function SubType(){ this.subproperty = false; } //SubType.prototype = new SuperType(); SubType.prototype.getSubValue = function(){ return this.subproperty; } // 繼承SuperType 就指向了SuperType的原型對象了 SubType.prototype = new SuperType(); var instance = new SubType(); alert(instance.getSuperValue()); // true alert(instance.property); //true
<iframe width="100%" height="300" src="http://jsfiddle.net/JimWang/dmkLmnhL/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>對象
若是把SubType中的subproperty改爲property會是怎麼樣呢 都會變成false
demo圖解
備註:之因此 SuperType中property屬性會出如今,SubType.prototype中,是由於property是一個實例屬性,而SubType.prototype是SuperType的一個實例對象,因此property屬性會出如今SubType.prototype中,可是這個property相對於instance(SubType的一個實例)卻又是一個原型屬性,因此若是將subproperty換成property的話,在return this.property時,優先找到實例屬性中有這麼一個屬性,就會返回實例屬性。此外這裏SubType.prototype.constructor 被重寫了,instance.constructor指向了SuperType 看圖instance.getSuperValue() 這個搜索的過程1) 搜索實例2) 搜索SubType.prototype3) 搜索SuperType.prototype搜索老是一步步向前到原型鏈末端中止(Object)