1. 程式人生 > >js原型鏈的深入理解

js原型鏈的深入理解

基本原則:

1、所有的物件都有__proto__屬性,該屬性對應該物件的原型。
2、所有的函式物件都有prototype屬性,該屬性的值會被賦值給該函式建立的物件的__proto__屬性。
3、普通物件沒有prototype屬性,普通物件都有constructor屬性
4、所有的原型物件都有constructor屬性,該屬性對應建立所有指向該原型的例項的建構函式。
5、函式物件和原型物件通過prototype和constructor屬性進行相互關聯。

6、原型鏈通過__proto__屬性完成,繼承屬性通過__proto__屬性遞歸向上查詢。

個人理解:

1、原型物件:就是構造器自己生成的一個自己的例項

,原型物件就是普通物件(除Function);

2、構造器(函式物件)的prototype屬性指向的都是構造器自帶的例項

3、原型物件constructor指向構造器

4、普通物件的__proto__屬性指向構造它的那個構造器自帶的例項,也就是原型物件;

!!!注意:

1、構造器都自己帶個例項!

2、Object.prototype.__proto__ === null 是原型鏈的終點!

3、構造器是函式,所以由Function生成,構造器的__proto__也指向生成他的建構函式的自帶例項,就是Function.prototype 

4、Function.prototype就是Function自己,所以是函式物件。

5、Object.__proto__指向Function.prototype。

使用構造器的圖(使用{}或者new Object()建立的物件,原型鏈直接指向Object.prototype):


原型鏈可以改變,一般用於繼承,已經存在屬性不覆蓋,不存在屬性在原型鏈中能夠找到。

示例程式碼1:

var will1 = new Person();
var will2 = new Person("Will2", 28);


will2.check = "qiuqiu20";               //原型鏈繼承過程: 已經有的屬性不重新賦值,沒有的屬性賦值;
will1.__proto__ = will2;


console.log(will1);  //will1.name === undefined  will1.age === undefined
console.log(will1.__proto__.hasOwnProperty("check"));    //true
console.log(will1.hasOwnProperty("check"));              //false

示例程式碼2:

var will1 = new Object();
var will2 = new Person("Will2", 28);

will2.check = "qiuqiu20";               //原型鏈繼承過程: 已經有的屬性不重新賦值,沒有的屬性賦值;
will1.__proto__ = will2;

console.log(will1);  			//will1.name === "Will2"  will1.age === 28
console.log(will1.__proto__.hasOwnProperty("check"));    //true
console.log(will1.hasOwnProperty("check"));              //false











參考文件:http://www.jb51.net/article/80109.htm