學習筆記之原型模式 prototype

自定義一個空對象

Person = function(){
}

使用prototype給Person設置公共的值

Person.prototype.name = "zhangsan";
Person.prototype.age = 22;
Person.prototype.say = function(){
                         alert("hello");
                       }

創建兩個person實例

var person1 = new Person();
alert(person1.name); //zhangsan
var person2 = new Person();
alert(person2.name); //zhangsan

上面兩個實例的name屬性值都是zhangsan,而zhangsan是在peototype中設置的,比如當一個實例的name屬性發生更改時,並不會去覆蓋prototype中的屬性,然後如果訪問的屬性是一個引用類型,並修改其中的值,那將導致所有實例訪問該屬性得到的都是修改後的值

person1.name = "yida";
alert(person1.name); //yida --來自實例的屬性
alert(person2.name); //zhangsan --來自原型的屬性

在把person1實例的name屬性刪除的話,屬性又會重新變回prototype的name值

delete person1.name; //刪除實例屬性
alert(person1.name); //zhangsan --來自原型的屬性

可以使用Object的方法HasOwnProperty可以查看返回屬性是來自實例中 還是來自原型 。來自實例返回true

alert(person1.hasOwnProperty("name"));

in 單獨使用時  只要給定屬性在實例或原型中存在,都返回true

alert("name" in person1); //true
alert("names" in person1); //false

在使用for - in 循環時,返回的是所有能通過對象訪問的,可枚舉的屬性。包括實例和原型。

for(var p in person1){
	if(p == "sayHi"){
		alert("found sayHi");
	}
}

取得對象上所有可枚舉的實例屬性,可以用Object.keys()方法,該方法返回一個包含所有可以枚舉屬性的字符串數組

var keys = Object.keys(Person.prototype);
alert(keys);//name,age,sayHi

 取的對象上所有實例屬性,無論是否可以枚舉

alert(Object.getOwnPropertyNames(Person.prototype));//constructor,name,age,sayHi


原型最好與構造函數組合使用,將公用的並值相同的屬性定義在原型中,而公用值不相等的屬性定義在構造函數,類似繼承的樣子。具體怎麼用有待學習。

發佈了28 篇原創文章 · 獲贊 13 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章