1. 程式人生 > 其它 >JavaScript 中 原型與原型鏈

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

這時 personPerson 建構函式的例項, 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

因為 personPerson 的例項,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: 先做簡單記錄,後期有新的理解再更新

學習js中原型與原型鏈的文章

Javascript繼承機制的設計思想
最詳盡的 JS 原型與原型鏈終極詳解