我對js原型和原型鏈的理解

我們知道在js中,萬物皆對象,對象可以說是重中之重了。每一個對象都擁有自己的屬性。但是在這個世界中有很多東西都是相似的,可以歸爲一類,他們有共同的方法和屬性。不可能讓每一個對象都定義一個屬性吧。那樣太消耗內存了。所以,在js中怎麼才能讓多個對象共享一個或多個方法呢?原型的出現就是爲了解決這個問題。

在js中每個對象都有一個與它關聯的對象,叫做原型對象。每一次獲取對象屬性都是一次查詢過程,當在對象的自有屬性中找不到時就會去查找它的原型對象。

在js中函數也是一個對象。每個函數都有一個prototype屬性(只有函數纔有prototype屬性),這是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共享的屬性和方法。按照字面意思來理解,那麼prototype就是通過調用構造函數而創建的那個對象實例的原型對象。其中原型對象會自動獲得一個constructor屬性,這個屬性指向prototype屬性所在的指針。如下面的Man.prototype.constructor指向Man。

function Man(name,age) {
	this.name = name;
	this.age = age;
}

function test() {
	var person1 = new Man("張三","18");
	var person2 = new Man("李四","19");
	Man.prototype.sex = "男";
	console.log(person1.sex); //男
	console.log(person2.sex); //男
}

每個男孩共有的屬性就是他的性別都是男,所以我們可以將此屬性添加到實例的原型對象中去。這樣每個實例都可以共享這個屬性。

我們前面說了每個函數都有prototype屬性,指向函數的原型對象。他的實例對象可以共享這個屬性,那我們怎麼將實例對象和原型對象關聯起來呢?在js中,任何對象都有一個屬性叫__proto__([[prototype]]),它也是一個指針,指向構造函數的原型對象,就是我們所能共享信息的那個對象。現在我們可以畫出一幅圖,展示他們之間的關係。

我們不同的對象可能會用到不同的屬性,比如說一個對象需要一種屬性,一個對象需要另一種屬性。這時如果我們把它都定義在一個原型對象中肯定是不好的,這時我們就需要java中常說的繼承。js中實現繼承的方式是通過原型鏈。

原型鏈是什麼呢,根據字面意思我們可以這樣理解,就是將原型連成一條鏈。我們上面講過,js每一次獲取對象中的屬性都是一次查詢過程,如果在自有屬性中找不到就會去原型對象中查找,如果原型對象中還查不到,就回去原型對象的原型中查找,也就是按照原型鏈查找,直到查找到原型鏈的頂端,也就是Object的原型。

function FutherType(){
	this.property = true;
}

FutherType.prototype.getFutherValue - function(){
	return this.property;
}

function SonType(){
	this.sonproperty = false;
}

SonType.prototype = new FutherType();

SonType.prototype.getSonValue = function(){
	return this.sonproperty;
}

var instance = new SonType();
console.log(instance.getFutherValue()); //true

原型對象之間的關係如下圖:

此文是我閱讀javascript高級程序設計後,對原型和原型鏈的理解,也當作學習js的筆記。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章