深入淺出理解javaScript原型鏈
本文實例講述了javaScript的原型鏈。分享給大家供大家參考。具體分析如下:
對于javascript原型鏈,以前都覺得是個很深的東西,一直沒有理解很明白,今天看了一些介紹后,發(fā)現(xiàn)這張圖,表示再沒有什么語言能比這張圖說得清楚了。
看了這張圖后突然對javascript有了質(zhì)的理解。
javascript的原型鏈有顯式和隱式兩種:
顯式原型鏈:即我們常見的prototype;
隱式原型鏈:在一般環(huán)境下無法訪問,即不可見,在FireFox下可以通過__proto__方式訪問;隱式原型鏈用于javascript引擎內(nèi)部對原型鏈的搜尋,通過顯示原型鏈來設(shè)置;
一、prototype和__proto__的概念
prototype是函數(shù)的一個屬性(每個函數(shù)都有一個prototype屬性),這個屬性是一個指針,指向一個對象。它是顯示修改對象的原型的屬性。
__proto__是一個對象擁有的內(nèi)置屬性(請注意:prototype是函數(shù)的內(nèi)置屬性,__proto__是對象的內(nèi)置屬性),是JS內(nèi)部使用尋找原型鏈的屬性。
用chrome和FF都可以訪問到對象的__proto__屬性,IE不可以。
二、new 的過程
var Person = function(){}; var p = new Person();
new的過程拆分成以下三步:
(1) var p={}; 也就是說,初始化一個對象p
(2) p.__proto__ = Person.prototype;
(3) Person.call(p); 也就是說構(gòu)造p,也可以稱之為初始化p
關(guān)鍵在于第二步,我們來證明一下:
var Person = function(){}; var p = new Person(); alert(p.__proto__ === Person.prototype);
這段代碼會返回true。說明我們步驟2是正確的。
三、示例
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屬性,當(dāng)我們執(zhí)行p.age時,會先在this的內(nèi)部查找(也就是構(gòu)造函數(shù)內(nèi)部),如果沒有找到然后再沿著原型鏈向上追溯。
這里的向上追溯是怎么向上的呢?這里就要使用__proto__屬性來鏈接到原型(也就是Person.prototype)進(jìn)行查找。最終在原型上找到了age屬性。
希望本文所述對大家的javascript程序設(shè)計有所幫助。
相關(guān)文章
JavaScript字符串轉(zhuǎn)數(shù)字的簡單實現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于JavaScript字符串轉(zhuǎn)數(shù)字的簡單實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11“不能執(zhí)行已釋放的Script代碼”錯誤的原因及解決辦法
“不能執(zhí)行已釋放的Script代碼”錯誤的原因及解決辦法...2007-09-09