JavaScript 中 原型與原型鏈
一直對 JS 中原型與原型鏈的內容不清楚,今天進行系統學習,做簡單記錄,方便以後加深印象;
建構函式
建構函式其實就是一個普通的函式, 但內部使用了 this
變數;
function Person(name, age) {
this.name = name;
this.age = age;
};
對建構函式使用 new
運算子,就能生成例項,並且 this
變數會繫結在例項物件上;
var person = new Person("趙雲", 22);
console.log(person.age); // 22
這時 person
是 Person
建構函式的例項, person
會自動含有一個 constructor
Person
;
console.log(person.constructor === Person); // true
由以上示例得出結論:例項的建構函式屬性(constructor)指向建構函式;
原型物件
JavaScript 規定, 每個建構函式都有一個 prototype
屬性, 指向一個物件; 這個物件的所有屬性和方法, 都會被建構函式的例項繼承;
什麼是 prototype
屬性:它是一個普通物件, 所有例項物件需要共享的屬性和方法,都放在這個物件裡面; 那些不需要共享的屬性和方法,就放在建構函式裡面;
Person.prototype.getAge = function() { return this.age; } console.log(typeof Person.prototype); // object console.log(Person.prototype);
那什麼是原型物件呢?
其實 Person.prototype
就是原型物件, 將一些需要共享的屬性和方法共享給例項物件的一個普通物件;
值得注意的是, 所有的原型物件都會獲得一個constructor
屬性, 這個屬性指向 prototype
所在的函式(Person);
console.log(Person.prototype.constructor === Person); // true
想要徹底理解為什麼會設計成這樣,可以閱讀文末的文章及其相關文章。
在建構函式的介紹裡面,我們得到一個結論;似乎和這裡有所聯絡
console.log(person.constructor === Person); // true console.log(Person.prototype.constructor === Person); // true
因為 person 是 Person 的例項,person 才能有 constructor 屬性;
因此得出一個結論:Person.prototype是建構函式Person的一個例項;
原型鏈
JS 在建立物件的時候,都有一個叫 __proto__
的內建屬性,用於指向建立它的建構函式的原型物件;
console.log(person.__proto__ === Person.prototype); // true
person
例項有一個__proto__
屬性,建立它的建構函式是 Person
, 建構函式的原型物件是Person.prototype
;
同樣,Person.prototype
物件也有__proto__
屬性,它指向建立它的函式物件(Object)的prototype
;
console.log(Person.prototype.__proto__ === Object.prototype); // true
Object.prototype
也有__proto__
屬性,他比較特殊,為null
console.log(Object.prototype.__proto__); // null
我們把這個由__propto__
屬性串起來的直到Object.prototype.__proto__
為null
的鏈叫做原型鏈;
ps: 先做簡單記錄,後期有新的理解再更新