方式 1:字面量(直接量)創(chuàng)建對(duì)象
形式 :主要通過(guò) var obj = { ... };語(yǔ)句進(jìn)行創(chuàng)建肋僧。
優(yōu)點(diǎn) :1)創(chuàng)建方式簡(jiǎn)單,快捷止潘,清晰覆山,適用于創(chuàng)建單個(gè)或非常少量或?qū)傩苑椒ǚ浅](méi)有規(guī)律的對(duì)象泥栖。
2)創(chuàng)建和添加屬性及屬性值可以在一個(gè)語(yǔ)句完成勋篓。
缺點(diǎn) :1)創(chuàng)建效率低譬嚣,不適用于程序化地生成多個(gè)對(duì)象。
2)生成的對(duì)象不具有相應(yīng)的對(duì)象類(lèi)型殊鞭,只是一個(gè)個(gè)單獨(dú)的對(duì)象操灿。
方式 2: new Object()創(chuàng)建對(duì)象
形式 :主要通過(guò) var obj = new Object();語(yǔ)句先創(chuàng)建一個(gè)對(duì)象(此時(shí)完全等價(jià)于 var obj = {}; 語(yǔ)句 )趾盐,然后再對(duì)這個(gè)對(duì)象進(jìn)行添加相應(yīng)的屬性和屬性值小腊。
優(yōu)點(diǎn) :相對(duì)來(lái)說(shuō)更直觀看出是在創(chuàng)建一個(gè)對(duì)象。
缺點(diǎn) :1)創(chuàng)建過(guò)程麻煩本缠,創(chuàng)建和添加屬性及屬性值要分兩個(gè)步驟完成丹锹。
2)創(chuàng)建效率低,不適用于程序化地生成多個(gè)對(duì)象峻村。
3)生成的對(duì)象不具有相應(yīng)的對(duì)象類(lèi)型锡凝,只是一個(gè)個(gè)單獨(dú)的對(duì)象。
方式 3:工廠模式(工廠方法张肾、工廠方式)創(chuàng)建對(duì)象
形式 :通過(guò)調(diào)用同一個(gè)函數(shù)生成多個(gè)對(duì)象
function createPerson (name,age,sex) {//工廠方式創(chuàng)建對(duì)象
var p = {}; //方式1
p.name = name;
p.age = age;
p.sex = sex;
return p;
// var p = { //方式2
// name : name;
// age : age;
// sex : sex;
// }
// return p;
// return { //方式3(ES6 新增吞瞪,此時(shí)需考慮兼容性)
// name, // 此時(shí)相當(dāng)于 name = name; 以下依次類(lèi)推
// age,
// sex
// }
}
var p1 = createPerson("張三",120,"男");
var p2 = createPerson("李四",56,"女");
優(yōu)點(diǎn) :1)可以通過(guò)調(diào)用同一個(gè)函數(shù)生成多個(gè)對(duì)象芍秆,提高代碼的效率妖啥。
2)可以使用一些ES6新增的較為簡(jiǎn)潔的書(shū)寫(xiě)方式寫(xiě)在封裝函數(shù)里对碌,但是需考慮兼容性。
缺點(diǎn) :1)當(dāng)只定義單個(gè)對(duì)象時(shí)書(shū)寫(xiě)過(guò)于麻煩怀读,累贅菜枷。
2)生成的對(duì)象不具有相應(yīng)的對(duì)象類(lèi)型惜姐,只是一個(gè)個(gè)單獨(dú)的對(duì)象。
方式 4 :通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象
形式 :使用var obj = new 類(lèi)型名(屬性值);和調(diào)用同一個(gè)函數(shù)(此時(shí)這個(gè)函數(shù)叫構(gòu)造函數(shù))方式創(chuàng)建對(duì)象
function Person (name,age,sex) {
this.name = name; // 如果調(diào)用時(shí)用的new方式坷衍,則this指代將來(lái)要?jiǎng)?chuàng)建的那個(gè)對(duì)象(此時(shí)這個(gè)函數(shù)叫構(gòu)造函數(shù))枫耳,如果不是用new方式而當(dāng)作一個(gè)普通函數(shù)使用時(shí)孟抗,則this指的是window
this.age = age;
this.sex = sex;
// return this; //new時(shí)自動(dòng)的返回this钻心,可以省略
當(dāng)做構(gòu)造函數(shù)的時(shí)候捷沸,默認(rèn)返回的是this痒给;當(dāng)顯示的去返回一個(gè)新的對(duì)象,則外面拿到的就是這個(gè)新的對(duì)象苍柏,如果返回的不是一個(gè)對(duì)象试吁,則返回給外面的還是this
// return { //(ES6新增)但是此時(shí)即使在調(diào)用的時(shí)用的new方式雖然返回值使得對(duì)象內(nèi)容相同楼咳,但此時(shí)對(duì)象不是一個(gè)類(lèi)型爬橡,與工廠方式效果一樣棒动,故不能這樣用。
// name,
// age,
// sex
// }
}
var p1 = new Person("張三",120,"男"); //構(gòu)造函數(shù)方式創(chuàng)建對(duì)象
var p2 = new Person("李四",56,"女");
優(yōu)點(diǎn) :1)可以通過(guò)調(diào)用同一個(gè)函數(shù)生成多個(gè)對(duì)象柜裸,提高代碼的效率疙挺。
2)生成的對(duì)象具有相應(yīng)的對(duì)象類(lèi)型,不僅僅只是生成一個(gè)個(gè)單獨(dú)的對(duì)象铐然。
缺點(diǎn) :1)當(dāng)只定義單個(gè)對(duì)象時(shí)書(shū)寫(xiě)過(guò)于麻煩搀暑,累贅跨琳。
2)不可以使用一些ES6新增的較為簡(jiǎn)潔的書(shū)寫(xiě)方式寫(xiě)在封裝函數(shù)里脉让,不然會(huì)造成返回的對(duì)象不具有相應(yīng)的對(duì)象類(lèi)型功炮,而只是一個(gè)個(gè)單獨(dú)的對(duì)象薪伏。
方式 5:通過(guò)原型創(chuàng)建對(duì)象
形式 :使用var obj = new 類(lèi)型名(屬性值);和調(diào)用同一個(gè)函數(shù)(此時(shí)這個(gè)函數(shù)叫構(gòu)造函數(shù))方式創(chuàng)建對(duì)象毅该,但是屬性及方法的添加在原型中。
function Person1 (name,age) {
}
Person1.prototype = {
construcor : Person1,//使原型對(duì)象重新指向Person1
this.name : name, //原型有屬性共享的缺點(diǎn)
this.age : age,
this.add : function () {}, //原型實(shí)現(xiàn)方法共享的優(yōu)點(diǎn)
console.log(this.name + "在說(shuō)"); //this根據(jù)調(diào)用方式不同this指代的對(duì)象不同
}
var p1 = new Person1();
優(yōu)點(diǎn) :方法共享
缺點(diǎn) :屬性共享
方式 6:動(dòng)態(tài)原型創(chuàng)建對(duì)象
形式 :通過(guò)保留構(gòu)造函數(shù)和原型的優(yōu)點(diǎn)且避免他們各自的缺點(diǎn)來(lái)實(shí)現(xiàn)眶掌。
function Person1 (name,age) { //構(gòu)造函數(shù)實(shí)現(xiàn)屬性不共享的優(yōu)點(diǎn)
this.name = name;
this.age = age;
this.add = function () {};
if (!Person1.prototype.speak) {//動(dòng)態(tài)原型 //if語(yǔ)句用來(lái)避免重復(fù)性的生成相同的函數(shù)造成內(nèi)存浪費(fèi)
Person1.prototype.speak = function () { //原型實(shí)現(xiàn)方法共享的優(yōu)點(diǎn)
console.log(this.name + "在說(shuō)");
}
} //方法是可以寫(xiě)在構(gòu)造函數(shù)外面的,但是為了實(shí)現(xiàn)封裝的整體性加到了構(gòu)造函數(shù)里面橡淆。
}
var p = new Person1();
優(yōu)點(diǎn) :保留構(gòu)造函數(shù)和原型的優(yōu)點(diǎn)且避免他們各自的缺點(diǎn)逸爵。
缺點(diǎn) :對(duì)于具有多個(gè)方法時(shí),if語(yǔ)句有點(diǎn)繁瑣师倔。
方式 7:動(dòng)態(tài)原型演變方式創(chuàng)建對(duì)象
形式 :在動(dòng)態(tài)原型上完善趋艘。
function Person1 (option) { //動(dòng)態(tài)原型演變方式1
// this.name = option.name; //添加屬性方式1瓷胧,屬性名和屬性值的添加在構(gòu)造函數(shù)中進(jìn)行
// this.age = option.age;
// this.add = function () {};
// for(var index in option){ //添加屬性方式2,適用于屬性名及屬性值不修改的情況
// this[index] = option[index];
// }
this._init(option);//動(dòng)態(tài)原型演變方式2杂数,把屬性的添加整合到原型中
}
Person1.prototype = {
_init : function (option){//動(dòng)態(tài)原型演變方式2
for(var index in option){
this[index] = option[index];
}
},
constructor : Person1, //讓對(duì)象的constructor重新指向Person1
speak : function () {
console.log(this.name + "在說(shuō)");
}
}
var pp1 = new Person1({name : "張三",age : 30});
var pp2 = new Person1({name : "李四",age : 40});
pp1.speak();//張三在說(shuō)
pp2.speak();//李四在說(shuō)
console.log(pp1.speak === pp2.speak); //true
console.log(pp1.add == pp2.add); //false
優(yōu)點(diǎn) :(1)保留構(gòu)造函數(shù)和原型的優(yōu)點(diǎn)且避免他們各自的缺點(diǎn)揍移。
(2)把對(duì)象的初始化都整合到原型中生成货矮,方便操作,并且避免了if語(yǔ)句的繁瑣。