考慮到在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對象【彀Γ可以無數(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只是一個普通的字符類型