javascript----------prototype

 

下面都是個人理解以及查找的網上的資料,如有不對的地方請指正

prototype

prototype在這裏是原型的意思,不是指那個框架...

如果有一個function test(){}

它會有一個name屬性,值爲函數名test  即test.name=="test"        //在 firefox下測試.........

test還有一個constructor屬性,他是指向他的構造函數的.... 即test.constructor 指向 Function

test還有一個__proto__屬性,他指向他的構造函數的原型 即test.__proto__===Function.prototype

ps: Function.__proto.__,Object.__proto__都是function(){} 不指向任何構造函數

它還有一個prototype屬性 ; 即test.prototype={}

 然後 prototype會自動添加一個test.prototype.constructor =test  它是指想函數本身的

/----------------------------個人覺得這個東西理解起來還是不容易(我也不能保證一定理解就是對)-------

prototype還會自動添加一個屬性,那就是__proto__ ;

它指向對象的父原型鏈 (ps不是父原型)
可以修改這個屬性,修改後就當前對象的父原型鏈就改變了

實例後,它的默認值是指向原型對象的 (重上面的test.__proto__===Function.prototype就可以看出來)

/-------------------------------------------------------------------------------------------------------------

可以測試一下 例子如下

 

 

至於prototype.__proto__;單獨來寫些例子  

Object.prototype爲原型鏈的終點

 

 

 

 

一個類,如何實例化成一個對象了,類裏面的prototype裏的屬性又是怎麼成爲實例裏面的屬性的了

這裏不得不說一下new 的過程

大概可以分成3步

 

<1> var p={}; 也就是說,初始化一個對象p。

<2> p.__proto__=Person.prototype;

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

 

 

別人給的一個new的過程

 

 

 

 

 

 

 

如一個類 ,new 之後的對象如下

 

每個對象在初始化的時候都會 __proto__有這麼一個屬性;

它指向的是父的原型  即Object.prtotype;

 如: (請在firefox下測試)

var test ={};
alert(test.__proto__);
alert(test.__proto__.a);  //出現的是undefined
Object.prototype.a = "test";
alert(test.__proto__.a);  //test

當有一個對象 假如是test ;查找他的a屬性,如果找不到,那麼他就會去__proto__裏找這個屬性,如果還找不到,就會到__proto__的__proto__中去找,這樣一直找啊找,直到沒有__proto__爲止,這就是傳說中的型鏈.

 

下面是一個例子;

 

 

另外一個例子  (自己動手修改prototype.__proto__的指向)

 

 

知道了原型鏈,那也就知道了爲什麼現在寫類都把公共的方法寫在原型上,因爲可以節省資源嘛..哈哈

發佈了73 篇原創文章 · 獲贊 0 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章