在j**ascript中一切皆是物件,所以我們會建立很多物件。那麼就來看看建立物件的方法.原型模式也是解決建立物件的問題的。解決了什麼問題,首先看下面幾種建立物件模式所帶來的問題。
function createperson(name,age)
return obj;
}var person1= createperson('p1', 20);
var person2= createperson('p2', 30);
用函式封裝建立物件的細節。當做普通函式使用,返回建立的物件。
問題:
這樣建立的物件無法區分出來類別。比如又有乙個動物物件的工廠,和這個完全一樣,根本無法區別。
function person(name,age)
}var person1 = new person('p1', 20);
var person2 = new person('p2', 30);
console.log(person1.constructor == person);//true
console.log(person1 instanceof person)//true
和工廠模式的區別,person不再是乙個普通函式,而是乙個建構函式,外面顯示呼叫new,建立物件,而且解決了工廠模式帶來的問題,但是產生了新的問題。
問題
大家都知道js中一切皆物件,那麼上述的sayname方法,每個物件都自己獨有乙個。那麼可不可以做到物件可以共享方法和屬性呢
function person(){}
person.prototype.name = "pl";
person.prototype.age = 20;
person.prototype.sayname = function()
var person1 = new person();
var person2 = new person();
person1.sayname();//pl
person2.sayname();//pl
建立的每個函式都有乙個prototype原型屬性,這個屬性是乙個指標,執行乙個物件,而這個物件就是原型物件。包含了所有例項共享的屬性和方法。
如下圖所示:
console.log(person.prototype);//輸出person的原型物件
console.log(person.prototype.isprototypeof(person1));//true
console.log(object.getprototypeof(person1) == person.prototype)//true
console.log(person1.__proto__ == person.prototype);//true
上圖展示了person建構函式,person原型屬性以及person例項之間的關係.person.prototype屬性指向原型物件,原型物件有個constructor屬性指向建構函式。例項都包含乙個屬性__proto__,指向原型物件。可以用檢視原始碼:person的值:object.getprototypeof(obj)
得到物件的原型物件,也可以用原型物件的isprototypeof
確定物件是否是原型物件的物件。
物件person1的值
物件person2的值
問題:
原型模式解決了方法和屬性共享,但是如果屬性是引用型別,如array,object。則會帶來新的問題。
function person()
person.prototype.name = "pl";
person.prototype.age = 20;
person.prototype.sayname = function()
person.prototype.friends = ['f1','f2'];
var person1 = new person();
var person2 = new person();
console.log(person1.friends);//[ 'f1', 'f2' ]
person1.friends.push('f3');
console.log(person2.friends);//[ 'f1', 'f2', 'f3' ]
上述中friends
這個屬性,是共享屬性.當例項person1改變其值的時候,也會影響例項person的值。
function person(friends)
person.prototype.name = "pl";
person.prototype.age = 20;
person.prototype.sayname = function()
var person1 = new person(['f1','f2']);
var person2 = new person(['f1','f2']);
console.log(person1.friends);//[ 'f1', 'f2' ]
person1.friends.push('f3');
console.log(person2.friends);//[ 'f1', 'f2']
組合使用建構函式模式與原型模式,是最常見的使用方式,能夠使用建構函式和原型模式的優勢。
function person(job)
person.prototype.name = "pl";
person.prototype.age = 20;
person.prototype.sayname = function()
hasownproperty檢查物件的屬性是否屬於物件自有的,如果是原型物件的屬性false.
var person1 = new person('job1');
console.log(person1.hasownproperty('job'));//true
console.log(person1.hasownproperty('name'));//true
in檢查某屬性是否存在,只要存在返回true(不區分原型物件和建構函式)
console.log('name' in person1);//true
console.log('job' in person1);//true
console.log('salay' in person1);//false
keys獲取物件可列舉的屬性,區分原型物件和建構函式。getownpropertynames
得到所有屬性,包括不可列舉的
console.log(object.keys(person1));//[ 'job' ]
console.log(object.keys(person.prototype));//[ 'name', 'age', 'sayname' ]
console.log(object.getownpropertynames(person.prototype));//[ 'constructor', 'name', 'age', 'sayname' ]
建立型模式 原型模式
使用原型例項指定建立物件的種類,並且通過轉殖這些原型建立新的物件 原理是將乙個原型物件傳給要發動建立的物件,該物件通過請求原型物件轉殖自己來建立過程 轉殖方法 public prototype clone jdk中為我們提供了轉殖的方法clone 從object繼承下來,乙個物件要實現轉殖,需要實現...
建立型模式 原型模式
原型 prototype 模式主要用於建立物件的轉殖,通常其最簡單的形式就是採用自定 clone 函式並 傳入物件引數以返回此物件的乙個副本,這在 python 實作上可使用內定 copy.cop y 或 copy.deepcopy 函式來達到此目的。當已有乙個物件但對此物件的某些部分會被變更卻又想...
原型模式 建立型模式
文章首發個人部落格 如果我們有乙個類 sheep 它裡面有兩個屬性,名稱 name 年齡 age 現在我們有乙個它的例項 s1 我們需要按照這個例項的屬性再去建立兩個物件。1 sheep data public class sheep 2 main public class main 原型模式 用原...