考慮到在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只是一個普通的字符類型
