關於js中原型鏈的理解

     咱們建立的每一個函數都有一個prototype(原型)屬性,這個屬性是一個指針,一個對象。不管何時,咱們只要建立一個新函數,就會根據一組特定的規則爲該函數建立一個prototype屬性,這個屬性對象指向函數的原型對象。在默認狀況下,全部原型對象都會自動得到一個 constroctor(構造函數)屬性,這個屬性包含一個指向prototype屬性所在函數的指針。例如:javascript

      

function Person(){}

    當咱們建立這個Person函數(對象)的時候,該函數便有了一個prototype屬性,它的原型對象Person.prototype會得到一個constroctor屬性,那麼Person.prototype.constroctor便指向了Person。更直白一點講就是,若是咱們再此基礎上再加一句java

var p=new Preson();

  那麼,p的原型就會指向構造器的prototype屬性,也就是Person.prototype。函數

    那麼,原型鏈具體的工做機制是什麼?請看下面這個例子spa

function foo(){}
foo.prototype.z=3;

var obj=new foo();
obj.y=2;
obj.x=1;

obj.x;//1
obj.y;//2
obj.z;//3

typeof obj.toString();//'function'
'z' in obj;//true
obj.hasOwnProperty('z');//false

     

  當輸出obj.z的時候,並不會由於obj對象沒有z屬性而輸出undefied,而是查找obj的原型也就是foo.prototype,這是js發現z的值是3,因此就會輸出obj.z的值爲3.prototype

 實際上,咱們用對象字面量建立的函數對象,其原型obj.prototype會指向Object.prototype,而Object.prototype也是由原型的,其值是null,這是上就是一個指針

 原型鏈,而這也是  typeof obj.toString(); 爲function的緣由,由於沿着原型鏈向上查找,便找到了object中的toString方法。code

相關文章
相關標籤/搜索