JavaScript參考型別之原型prototype,javascript參考型別
什麼是原型
Javascript對象中的原型屬性可以返回物件類型的原型引用,原型prototype歸構造方法所有。
JavaScript中,每個對象都串連到一個原型對象,並且它可以從中繼承屬性。所有通過對象字面量建立的對象都串連到Object.prototype,它是JavaScript中的標配對象。
當你建立一個新對象的時候,你可以選擇某個對象作為它的原型,新對象具有原型對象的所有屬性和方法。如果新對象有和原型中同名的屬性或方法,新對象的覆蓋原型中的。
function Cat(){this.name = "tomcat";this.age = 3;this.salary = 123;this.sayName = function(){alert(this.name);}}function CatSon(){this.name = "dingdang";this.address = "new york";this.father = "tomcat";this.hobby = "fishing";};CatSon.prototype = new Cat;var catSon = new CatSon;alert(catSon.age); // output 3alert(catSon.father); // output tomcatcatSon.sayName(); // output dingdang
上面的代碼中,我們定義了兩個構造方法Cat() 和 CatSon(),其中CatSon.prototype指向了new Cat; 即CatSon 的原型指向了Cat 執行個體,那麼CatSon 的執行個體擁有Cat 執行個體的所有屬性和方法。
由於CatSon 自己也定義了name屬性,所以,CatSon的執行個體catSon 的name屬性值為dingdang ,即同名的子執行個體屬性覆蓋原型屬性。
當我們對某個對象做出改變時,不會觸及該對象的原型。
接上面代碼,我們修改catSon.name
// 對對象的修改,不會觸及到原型catSon.name = "jiafei";alert(CatSon.prototype.name); // output tomcat
委託
原型串連只有在訪問屬性值的時候才被用到。如果我們嘗試去擷取對象的某個屬性值,但該對象沒有此屬性名稱,那麼JavaScript會試著從原型對象中擷取屬性值。如果那個原型對象也沒有該屬性,那麼再從它的原型中尋找,以此類推,直到該過程最後達終點Object.prototype。如果想要的屬性完全不存在於原型鏈中,那麼結果就是undefined值。這個過程稱為委託。
上面的代碼中,我們訪問catSon.door 屬性
由於CatSon 沒有定義door屬性,CatSon 的原型 Cat 也沒有定義該屬性,到了Cat 的原型Object 裡面也沒有定義該屬性,所以catDoor屬性值為undefined。
alert(catSon.door); // output undefined
原型關係是一種動態關係。如果我們添加一個新的屬性到原型中,該屬性會立即對所有基於該原型建立的對象可見。
// 原型的動態綁定Object.prototype.door ="blueDoor";alert(catSon.door); //output blueDoor
跟prototype相關方法
接下來,看看在Object 類裡面的幾個跟原型相關的方法。
hasOwnProperty
判斷對象是否有某個特定的屬性。
這是屬性必須是該對象自有的屬性,不能是從原型處繼承來的屬性或方法。
alert(catSon.hasOwnProperty("name")); // truealert(catSon.hasOwnProperty("sayName")); // false
isPrototypeOf(object)
判斷該對象是否為另一個對象的原型
alert(Cat.prototype.isPrototypeOf(catSon));// truealert(CatSon.prototype.isPrototypeOf(catSon));// true var obj = new Object;alert(CatSon.prototype.isPrototypeOf(obj));// false
propertyIsEnumerable(property)
判斷給定的屬性是否可以用for…in 語句進行枚舉
alert(catSon.propertyIsEnumerable("name")); // truefor (pro in catSon){alert(pro + "=" + catSon[pro]);}