深入淺出理解javaScript原型鏈

來源:互聯網
上載者:User

深入淺出理解javaScript原型鏈

   這篇文章主要介紹了對javaScript原型鏈的理解,以執行個體形式對javaScript原型鏈的概念及相關提示做了較為淺顯易懂的分析,需要的朋友可以參考下

  本文執行個體講述了javaScript的原型鏈。分享給大家供大家參考。具體分析如下:

  對於javascript原型鏈,以前都覺得是個很深的東西,一直沒有理解很明白,今天看了一些介紹後,發現這張圖,表示再沒有什麼語言能比這張圖說得清楚了。

  看了這張圖後突然對javascript有了質的理解。

  javascript的原型鏈有顯式和隱式兩種:

  顯式原型鏈:即我們常見的prototype;

  隱式原型鏈:在一般環境下無法訪問,即不可見,在FireFox下可以通過__proto__方式訪問;隱式原型鏈用於javascript引擎內部對原型鏈的搜尋,通過顯示原型鏈來設定;

  一、prototype和__proto__的概念

  prototype是函數的一個屬性(每個函數都有一個prototype屬性),這個屬性是一個指標,指向一個對象。它是顯示修改對象的原型的屬性。

  __proto__是一個對象擁有的內建屬性(請注意:prototype是函數的內建屬性,__proto__是對象的內建屬性),是JS內部使用尋找原型鏈的屬性。

  用chrome和FF都可以訪問到對象的__proto__屬性,IE不可以。

  二、new 的過程

  ?

1

2

var Person = function(){};

var p = new Person();

  new的過程拆分成以下三步:

  (1) var p={}; 也就是說,初始化一個對象p

  (2) p.__proto__ = Person.prototype;

  (3) Person.call(p); 也就是說構造p,也可以稱之為初始化p

  關鍵在於第二步,我們來證明一下:

  ?

1

2

3

var Person = function(){};

var p = new Person();

alert(p.__proto__ === Person.prototype);

  這段代碼會返回true。說明我們步驟2是正確的。

  三、樣本

  ?

1

2

3

4

5

6

7

var Person = function(){};

Person.prototype.sayName = function() {

alert("My Name is Jacky");

};

Person.prototype.age = 27;

var p = new Person();

p.sayName();

  p是一個引用指向Person的對象。我們在Person的原型上定義了一個sayName方法和age屬性,當我們執行p.age時,會先在this的內部尋找(也就是建構函式內部),如果沒有找到然後再沿著原型鏈向上追溯。

  這裡的向上追溯是怎麼向上的呢?這裡就要使用__proto__屬性來連結到原型(也就是Person.prototype)進行尋找。最終在原型上找到了age屬性。

  希望本文所述對大家的javascript程式設計有所協助。

聯繫我們

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