2018-10-20創(chuàng)建對(duì)象的方法

創(chuàng)建對(duì)象的工廠模式:
普通創(chuàng)建多個(gè)對(duì)象會(huì)比較繁瑣,效率低。并且實(shí)力與原型之間,沒(méi)有任何聯(lián)系,可以看出有什么聯(lián)系。

構(gòu)造函數(shù)模式
1.new調(diào)用的函數(shù)為構(gòu)造函數(shù),構(gòu)造函數(shù)與普通函數(shù)的區(qū)別僅僅在于是否使用了new來(lái)調(diào)用。
2.所謂“構(gòu)造函數(shù)”,就是專(zhuān)門(mén)用來(lái)生成“對(duì)象”的函數(shù)。他提供模板,作為對(duì)象的基本結(jié)構(gòu)。
3.構(gòu)造函數(shù)內(nèi)部使用了this變量。對(duì)構(gòu)造函數(shù)使用new運(yùn)算符,就能生成實(shí)例,并且this變量會(huì)綁定在實(shí)例對(duì)象上。
4.instanceof驗(yàn)證原型對(duì)象與實(shí)例對(duì)象之間的關(guān)系。
5.call和apply方法的使用
6.問(wèn)題:浪費(fèi)內(nèi)存--使用構(gòu)造函數(shù)每生成一個(gè)實(shí)例,都增加一個(gè)重復(fù)的內(nèi)容,多占用一些內(nèi)存。這樣既不環(huán)保,也缺乏一定的效率。兩個(gè)實(shí)例的地址是不同的。也就是說(shuō)如果有兩個(gè)實(shí)例化的對(duì)象,那么將在內(nèi)存中占用的是兩份空間。
function people(name, weapon){
this.name = name;
this.weapon = weapon;
this.run = function(){
return this.name + '的武器是' + this.weapon;
}
}
var wujing = new people('沙悟凈',‘禪杖’);
alert(wujing.run);
alert(wujing instanceof people);返回true,說(shuō)明有從屬關(guān)系
注意:構(gòu)造函數(shù)不需要使用return語(yǔ)句來(lái)返回對(duì)象,它的返回時(shí)自動(dòng)完成的

原型模式
prototype模式
jacascript規(guī)定,每一個(gè)構(gòu)造函數(shù)都有一個(gè)prototype屬性,指向另一個(gè)對(duì)象。這個(gè)對(duì)象的所有屬性和方法,都會(huì)被構(gòu)造函數(shù)的實(shí)例繼承。可以把那些不變的屬性和方法,直接定義在prototype對(duì)象上。
1.prototype方式定義的方式,函數(shù)不會(huì)拷貝到每一個(gè)實(shí)例中,所有的實(shí)例共享prototype中的定義,節(jié)省了內(nèi)存。
2.prototype模式的驗(yàn)證方法
(a)isPrototypeOf()這個(gè)方法用來(lái)判斷,某個(gè)prototype對(duì)象和某個(gè)實(shí)例之間的關(guān)系
(b)hasOwnPrototype()每個(gè)實(shí)例對(duì)象都有一個(gè)hasOwnPrototype()方法,用來(lái)判斷某一個(gè)屬性到底是本地屬性,還是繼承自prototype對(duì)象的屬性。
3.對(duì)象的cunstructor屬性用于返回創(chuàng)建該對(duì)象的構(gòu)造函數(shù)(在js中,每個(gè)具有圓形的對(duì)象都會(huì)自動(dòng)獲得constructor屬性)。
4.原型方式的問(wèn)題:
(a)構(gòu)造函數(shù)沒(méi)有參數(shù)。使用原型方式,不能通過(guò)給構(gòu)造函數(shù)傳遞參數(shù)來(lái)初始化屬性的值。
(b)屬性指向的是對(duì)象,而不是函數(shù)的時(shí)候。函數(shù)共享不會(huì)造成問(wèn)題,但對(duì)象卻很少被多個(gè)實(shí)例共享,如果共享
function peopleObj(){}
peopleObj.prototype.name = '嘍啰';
peopleObj.prototype.weapon = '大刀';
peopleObj.prototype.run = function() {
return this.name + '的武器是' + this.weapon;
}
var monster1 = new peopleObj();
var monster2 = new peopleObj();
alert(monster1.run == monster2.run);//true 說(shuō)明他們的引用是同一個(gè)地址
還可以這樣寫(xiě):
function Monster(){}
Monster.prototype = {
name: '嘍啰',
weapon: '大刀',
job: ['巡山', '打更'],
run: function(){return this.name + '的工作是' + this.job}
}
var monsterA = new Monster();
var monsterB = new Monster();
注意:這時(shí)所有實(shí)例的方法,其實(shí)都是同一個(gè)內(nèi)存地址,指向prototype對(duì)象,因此就提高了運(yùn)行效率。

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

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

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