原型模式 一

2022-09-10 14:12:28 字數 3906 閱讀 6105

在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__,指向原型物件。可以用object.getprototypeof(obj)得到物件的原型物件,也可以用原型物件的isprototypeof確定物件是否是原型物件的物件。

檢視原始碼:person的值:

物件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 原型模式 用原...