JS 建立物件的7種方法(二)

2022-09-08 13:27:09 字數 3229 閱讀 9415

3.原型模式(prototype)

我們建立的每個函式都有乙個prototype屬性,這個屬性是乙個指標,指向乙個物件。使用原型物件的好處是讓所有例項共享它所包含的屬性和方法。

function

person()

person.prototype.name = "bob";

person.prototype.age = 18;

person.prototype.job = "developer";

person.prototype.sayname = function

()var person1 = new

person();

var person2 = new person();

3.1 理解原型物件

只要建立了乙個新函式,就會根據一組特定的規則為該函式建立乙個prototype屬性,這個屬性指向函式的原型物件。在預設情況下,所有原型物件都會獲得乙個constructor屬性,這個屬性指向prototype屬性所在的函式。

當呼叫建構函式建立乙個新例項後,該例項的內部包含乙個指標(內部屬性--[[prototype]]),指向建構函式的原型物件。 雖然我們無法訪問到[[prototype]],但可以通過isprototypeof()方法來確定物件之間是否存在這種關係。如果[[prototype]]指向呼叫isprototypeof()方法的物件,那麼這個方法就返回true。

alert(person.prototype.isprototypeof(person1));    //

true

alert(person.prototype.isprototypeof(person2)); //

true

object.getprototypeof()方法返回[[prototype]]的值:

alert(object.getprototypeof(person1) == person.prototype);   //

true

alert(object.getprototypeof(person1).name); //

bob

我們可以通過物件例項訪問儲存在原型中的值,但不能通過物件例項改變原型中的值:

person1.name = "peter";

person1.sayname();

//"peter" 來自例項

person2.sayname(); //

"bob" 來自原型

使用hasownproperty()方法可以檢測乙個屬性是存在於例項中,還是存在於原型中。接上面的例子:

alert(person1.hasownproperty("name"));    //

true

alert(person2.hasownproperty("name")); //

false

alert(person1.hasownproperty("age")); //

false

3.2 原型與in操作符in操作符會在 通過物件能訪問屬性時返回true, 無論該屬性存在於例項中還是原型中。

alert("name" in person1);    //

true 來自例項

alert("name" in person2); //

true 來自原型

同時使用hasownproperty()方法與in操作符,就可以確定該屬性的位置。

function

hasprototypeproperty(object, name)

alert(hasprototypepropoty(person1, "name"));  //false

alert(hasprototypepropoty(person2, "name")); //true

使用object.keys()方法可以取得物件上所有可列舉的例項屬性:

var keys =object.keys(person.prototype);

alert(keys);

//name, age, title, sayname

var keys1 =object.keys(person1);

alert(keys1);

//name

object.getownpropertynames() 可以或得所有例項屬性(包括不可列舉的)

alert(object.getownpropertynames(person.prototype));    //

constructor,name,age,title,sayname

3.3 更簡單的原型方法

function

person()

person.prototype =

};

在上面的例子中,我們將person.prototype設定為等於乙個以物件字面量形式建立的新物件。最終結果相同,但constructor屬性不再指向person。上面的例子本質上重寫了預設的prototype物件,因此constructor屬性也就變成了新物件的constructor屬性(指向object建構函式)。

3.4原型物件的問題

1. 原型模式省略了為建構函式傳遞引數,所以所有例項在預設情況下都取得相同的屬性值。

2. 對於引用型別值:

function

person()

person.prototype =

}; var person1 = new

person();

var person2 = new

person();

person1.friends.push("alice");

alert(person1.friends);

//court, ann, alice

alert(person2.friends); //

court, ann, alice

JS 建立物件的7種方法(三)

4.組合使用建構函式模式和原型模式 hybrid 建構函式模式用於定義例項屬性 原型模式用於定義方法和共享的屬性。function people name,age,job people.prototype sayfriends function var people1 new people bob ...

JS建立物件的三種方法

工廠模式 function person name,age,job return obj var person person five 17,web person.sayname 工廠模式定義好形參之後,new乙個物件,然後return回去 即可在外部呼叫函式,然後傳入實參。即可使用函式內部的方法建...

JS建立物件的三種方法

一 工廠模式 通過函式來封裝,用object方式來建立 function creatperson name,age,job return o var person1 createperson judy 23,teacher var person2 createperson andy 21,docto...