js 原型鏈的介紹

對象的原型鏈:一個對象所擁有的屬性不單單是它自己擁有的屬性,他還會從其餘對象中繼承一些屬性。當js在一個對象中找不到須要的屬性時,它會到這個對象的父對象上去找,以此類催,這就構成了對象的原型鏈。函數

下面分別介紹__proto__和prototype兩個屬性this

__proto__:全部的對象均具備的屬性,可稱爲隱式原型,一個對象的隱式原型指向構造該對象的構造函數的原型,也保證了實例可以訪問在構造函數原型中定義的屬性和方法。spa

prototype:方法這個特殊的對象,除了有上述的__proto__屬性以外,還有本身特殊的屬性--原型屬性(prototype)。這個屬性是一個指針,指向一個對象。這個對象的用途就是包含全部實例共享的屬性和方法(咱們把這個對象叫作原型對象)。原型對象也有一個屬性,叫作constructor,這個屬性包含了一個指針,指回原構造函數。prototype

請看下面的圖,來形象的理解一下:指針

例子:code

function Foo(_name) {
  this.name = _name;
}
Foo.prototype.show = function() {
  console.log('I am ', this.name);
};
var f1 = new Foo('obj1');
var f2 = new Foo('obj2');

f1.show();  //  I am obj1
f2.show();  //  I am obj2

定義的show方法是在Foo.prototype上,當咱們執行f1.show(),首先會在f1上去尋找show的方法,沒有該方法,就會從f1的原型(__proto__)上去找,找到了就能夠調用。對象

結合這個例子和圖來總結一下:::blog

1.全部函數都有一個prototype指針,指向原型對象,如圖中的Foo的prototype指針。prototype指針的意義是,當咱們使用這個構造函數new出新對象的時候,新對象的原型是誰繼承

2.構造函數的prototype所指向的原型對象有一個constructor指針,指回構造函數。如圖中Foo.prototype的constructor指針指向Foo。constructor指針有助於咱們找到一個對象的構造函數是誰。原型鏈

3.__proto__每一個對象都有,js在new一個對象的時候,會將它的__proto__指向構造函數的prototype指向的那個對象。在上圖中,f一、f2這些實例對象的__proto__都指向了Foo.prototype。

4.若是一個對象的__proto__指向了另外一個對象,那麼前者就繼承了後者的全部屬性

相關文章
相關標籤/搜索