js原型鏈的深入理解
阿新 • • 發佈:2019-01-25
基本原則:
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