JavaScript參考型別之原型prototype,javascript參考型別

來源:互聯網
上載者:User

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]);}





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.