JS的prototype和__proto__

prototype和__proto__的概念

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

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

對象的__proto__指向建立該對象的函數的prototypethis

用chrome和FF均可以訪問到對象的__proto__屬性,IE不能夠。prototype

new 的過程

Person = function(){};
 p =  Person();

new的過程拆分紅如下三步:指針

  1. var p={}; 也就是說,初始化一個對象p
  2. p.__proto__ = Person.prototype;
  3. Person.call(p); 也就是說構造p,也能夠稱之爲初始化p

關鍵在於第二步,咱們來證實一下:code

Person = function(){};
 p =  Person();
alert(p.__proto__ === Person.prototype);

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

Person = function(){};
Person.prototype.sayName = function() {
    alert("My Name is Jacky");
};

Person.prototype.age = 27 p =  Person();
p.sayName();

p是一個引用指向Person的對象。咱們在Person的原型上定義了一個sayName方法和age屬性,當咱們執行p.age時,會先在this的內部查找(也就是構造函數內部),若是沒有找到而後再沿着原型鏈向上追溯。原型鏈

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

相關文章
相關標籤/搜索