咱們建立的每一個函數都有一個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