JavaScript原型繼承之基礎機制分析

來源:互聯網
上載者:User

這一語言功能的本質依賴於 JavaScript 特有的原型鏈(prototype chain)模式。
所以嚴格意義上說,JavaScript 是基於原型的物件導向語言。也就是說,每個執行個體對象都具有一個原型。對象從該原型中繼承屬性和方法。

1、建構函式

利用建構函式,可以簡單地建立對象。建構函式內的 this 關鍵字指向執行個體對象本身: 複製代碼 代碼如下:function People(name){
this.name = name;
}

使用 new 運算子和建構函式建立執行個體對象: 複製代碼 代碼如下:var people = new People('小明');
console.log(people.name); //小明

但如果建立了兩個執行個體,這兩個執行個體之間無法直接共用屬性和方法: 複製代碼 代碼如下:var people1 = new People('小明');
var people2 = new People('小王');
people1.sex = 'male';
console.log(people2.sex); //undefined

也就是說對象一旦被執行個體化,其屬性方法都獨立存在,對某個屬性的修改不會影響到其他執行個體。

2、Prototype

於是就有了 prototype 屬性,這個屬性是在產生執行個體對象時自動建立的。它本身又是一個對象,擁有能夠在執行個體間共用的屬性和方法。而執行個體本身的屬性和方法,則包含在建構函式中。換句話說,建構函式內部的屬性和方法,在經過執行個體化後都成為了本地的屬性和方法,而原型(prototype)中的屬性和方法在執行個體中只是一種引用,因此能夠被多個執行個體共用。

還是剛才那個建構函式,現在為它增加 prototype 屬性: 複製代碼 代碼如下:People.prototype.sex = 'female';
//或者寫成 People.prototype = {sex: 'female'};
console.log(people1.sex); //male
console.log(people2.sex); //female

People 建構函式的 prototype 屬性參數會直接影響到 people1 和 people2 兩個執行個體。

但為什麼 people1.sex 輸出 male 呢?這是由於在 JavaScript 中,原型關係以遞迴形式存在。對象的原型也是一個對象,而原型的本身也可能具有一個原型。原型的最高層級是全域的 Object 對象。

這就是說,一旦 people1.sex 被設定為 male 後,它在原型中對應的值就無法被暴露出來。假如 people1.sex 本身沒有值,才會從建構函式的 prototype 屬性中讀取,以此類推一級一級向上尋找,直到 Object 對象。

註:使用 “null” 給對象賦值,可以銷毀自訂對象,釋放記憶體資源。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.