重新認識原型和原型鏈二

wade3po發表於2019-03-13

知道了prototype這個原型(也叫原型屬性、原型物件,不要搞混了,原型、原型屬性、原型物件都是同一個東西),我們還需要知道__proto__和constructor兩個屬性。

先說說constructor屬性,這個屬性是函式獨有的,而且是存在於原型prototype中,constructor指向函式物件。

function User() {};

console.log(User.prototype);

重新認識原型和原型鏈二
User是函式物件(也叫建構函式),所以User有prototype屬性,prototype屬性有constructor屬性,constructor屬性指向這個函式物件。於是出現了一個死迴圈,函式物件User的prototype屬性下有constructor屬性,而constructor屬性指向函式物件User。你一直點開,會發現一直有constructor和prototype,沒有盡頭。但是這個屬性具體有什麼作用還沒查到。

__proto__也叫隱式原型,指向建構函式的prototype。

function User() {

}

User.prototype.name = 'wade';

var user = new User();

console.log(User.prototype);

console.log(user.proto);

重新認識原型和原型鏈二
正是因為有隱式原型的存在,例項物件才能使用建構函式原型上一系列的方法和屬性。

var time = new Date();

console.log(Date.prototype);

console.log(time.proto);

console.log(time.proto === Date.prototype);

User和Date叫建構函式,user和time是例項物件,例項物件的隱式原型__prpto__指向建立出例項的建構函式的顯示原型prototype。

除了null和undefined之外,所有的資料型別都有隱式原型__proto__

var a = 10;

var b = '10';

var c = true;

var d = {};

console.log(a.proto);

console.log(b.proto);

console.log(c.proto);

console.log(d.proto);

重新認識原型和原型鏈二

都是指向自己的資料型別,Number、String、Boolean,所以通過__proto__,例項物件可以使用建構函式的所有方法和屬性。

有一點要特別注意,建構函式的隱式原型__proto__在顯示原型prototype上。雖然也可以列印出資料。

function User() {}

console.log(User.prototype);

console.log(User.proto);

重新認識原型和原型鏈二

歡迎關注Coding個人筆記 訂閱號

相關文章