-
字面量法
結(jié)構(gòu)
var 對(duì)象 = {
屬性名01:屬性值未状,
屬性名02:屬性值,
方法01:function(){函數(shù)體}
}
適用場(chǎng)合:只需簡(jiǎn)單創(chuàng)建單個(gè)對(duì)象
問(wèn)題:如果需要?jiǎng)?chuàng)建多個(gè)相似的對(duì)象析桥,那么代碼中冗余度太高(重復(fù)的代碼太多)
代碼:
var book1 = {
name:"悟空傳",
author:"今何在",
press:"湖南文藝出版社",
price:"28.00",
logDes:function(){
console.log("書名:" + this.name + "作者:" + this.author);
}
}
- 內(nèi)置構(gòu)造函數(shù)法
var book1 = new Object();
//01 設(shè)置屬性
book1.name = "花田半畝";
book1.author = "田維";
book1.price = "40.01";
//02 設(shè)置方法
book1.logDes = function (){
console.log("書名:" + this.name);
}
問(wèn)題:如果需要?jiǎng)?chuàng)建多個(gè)相似的對(duì)象,那么代碼中冗余度太高(重復(fù)的代碼太多)
-
工廠法
對(duì)于內(nèi)置法把固定的部分提取寫成函數(shù)的函數(shù)體艰垂,把變化的部分提取泡仗,作為參數(shù)傳遞
function createBook(name,author){
//01 創(chuàng)建空的對(duì)象
var o = new Object();
//02 設(shè)置屬性和方法
o.name = name;
o.author = author;
o.logDes = function(){
console.log("作者是:" + this.author);
}
//04 返回新創(chuàng)建的對(duì)象
return o;
}
問(wèn)題:如果創(chuàng)建多個(gè)不同類型的對(duì)象,那么我們無(wú)法分辨
function createPerson(name,age){
var o = new Object();
o.name = name;
o.age = age;
return o;
}
function createDog(name,age)
{
var o = new Object();
o.name = name;
o.age = age;
return o;
}
//創(chuàng)建具體的對(duì)象
var obj1 = createPerson("張三",88);
var obj2 = createDog("阿黃",6);
console.log(obj1.constructor); //Object
console.log(obj2.constructor); //Object
最終的返回值類型都是Object類型,只看結(jié)果不能夠準(zhǔn)確的辨認(rèn)obj1和obj2對(duì)應(yīng)的都是誰(shuí)
-
構(gòu)造法
001 提供一個(gè)構(gòu)造函數(shù)
002 通過(guò)this指針來(lái)設(shè)置屬性和方法
003 通過(guò)new操作符創(chuàng)建對(duì)象
function Person(name,age){
// 默認(rèn) 創(chuàng)建對(duì)象
//var o = new Object();
//默認(rèn)會(huì)賦值給this
//this = o;
// 01 通過(guò)this指針來(lái)設(shè)置屬性和方法
this.name = name;
this.age = age;
this.showName = function(){
console.log(this.name);
};
this.showAge = function(){
console.log(this.age);
}
//默認(rèn)返回
//return this;
}
//03 使用new操作符來(lái)創(chuàng)建對(duì)象
var p1 = new Person("張三",20);
var p2 = new Person("張老漢",200);
console.log(p1);
console.log(p2);
自定義構(gòu)造函數(shù)方式創(chuàng)建對(duì)象內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)
01 我們?cè)谑褂胣ew關(guān)鍵字調(diào)用構(gòu)造哈函數(shù)的時(shí)候猜憎,內(nèi)部默認(rèn)會(huì)創(chuàng)建一個(gè)空的對(duì)象
02 默認(rèn)會(huì)把這個(gè)空的對(duì)象賦值給this
03 通過(guò)this來(lái)設(shè)置新對(duì)象的屬性和方法
04 在構(gòu)造哈函數(shù)的最后娩怎,默認(rèn)會(huì)把新創(chuàng)建的對(duì)象返回
自定義構(gòu)造函數(shù)和工廠函數(shù)對(duì)比
001 函數(shù)的名稱不一樣,構(gòu)造函數(shù)首字母大寫
002 自定義構(gòu)造函數(shù)創(chuàng)建方式內(nèi)部會(huì)自動(dòng)的創(chuàng)建空對(duì)象并且賦值給this
003 默認(rèn)會(huì)自動(dòng)返回新創(chuàng)建的對(duì)象
返回值
01 沒(méi)有顯示的return ,默認(rèn)會(huì)把新創(chuàng)建的對(duì)象返回
02 顯示的執(zhí)行了return語(yǔ)句胰柑,就得看具體的情況
001 返回的是值類型截亦,那么直接忽略該返回,把新創(chuàng)建的對(duì)象返回
002 返回的是引用類型的數(shù)據(jù)柬讨,會(huì)覆蓋掉新創(chuàng)建的對(duì)象崩瓤,直接返回引用數(shù)據(jù)類型的值
function Dog(name)
{
this.name = name;
//return "demo"; 忽略
return function (){console.log(name);};最終返回的值
}
var dog = new Dog("阿黃");
console.log(dog);
//function (){console.log(name) -->返回值