javascript創(chuàng)建對象的幾種方式

考慮到在ECMAScript中無法創(chuàng)建類(納尼),用函數(shù)來封裝以特定接口創(chuàng)建對象的細節(jié)。

1、工廠模式

function ?createPerson(name,age,job){

?var ?o = new Object();

o.name=name;

o.age=age;

o.job=job;

o.sayname=function(){

?alert( this.name);

}(三個屬性和一個方法

return o;

}

var person1=createPerson(“nanlan",21,"software enginner");

var person2=createPerson("xiaoju",22,"photograper");

函數(shù)createPerson()能夠根據(jù)接受的參數(shù)構(gòu)建一個包含所有必要信息的person對象??梢詿o數(shù)次調(diào)用這個對象,每次都會返回三個屬性和一個方法的對象。工廠模式雖然解決了創(chuàng)建多個相似對象的問題,卻沒有解決對象識別的問題(即知道一個對象的類型)

2、構(gòu)造函數(shù)模式

function Person(name,age,job){

?this.name=name;

this.age=age;

this.job=job;

this.sayname=function(){

alert(this.name);

}

}

var person1=new Person("nanlan",22,"software ?enginner");

var person2=new Person("xiaoju",21,"photographer");

沒有顯式的創(chuàng)建對象,直接將屬性和方法賦給了對象,沒有return語句。構(gòu)造函數(shù)始終都是以一個大寫字母開頭,而非構(gòu)造函數(shù)應(yīng)該以一個小寫字母開頭。

創(chuàng)建person的新實例,必須使用new操作符。以這種方式調(diào)用構(gòu)造函數(shù)會經(jīng)歷以下4個步驟,1)創(chuàng)建一個新對象 2)將構(gòu)造函數(shù)的作用域給新對象(因此this就指向了這個新對象) 3)執(zhí)行構(gòu)造函數(shù)的代碼 4)返回新對象

所有的對象式Person的實例,也是Object的實例,可以通過instaceof來檢測,你如

person1 instaceof Object ,person2 instaceof Person//均返回ture

3、原型模式

function Person(){

Person.prototype.name="nanlan";

Person.prototype.age=29;

Person.Prototype.job="softWare Engineer";

Person.Prototype.sayname=function(){

alert(this.name);

}

var person1=new Person();

person2.sayname();

var person2= new Person();

person2.sayname();

alert(person1.sayname==person2.name);

}



恩,這是關(guān)于js原型的問題,感覺比閉包還要難懂。發(fā)現(xiàn)一個挺有意思的一個問題,就是這道題,原型是采用字面變量去定義的,然后有兩個實例Person1和Person2實例,其中對通過實例對原型當中的數(shù)組進行了修改,而Person1和Person2會共享原型的引用類型,比如說數(shù)組,所以他們的結(jié)果是一樣的,但是Person1也也修改了原型當中name的值,這個時候結(jié)果不一樣,原因是因為name只是一個普通的字符類型


猜猜這道題的結(jié)果是多少
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容