Javascript中的對(duì)象和原型(二)
在上篇文章中JavaScript中的對(duì)象和原型(一)提到了JavaScript中對(duì)象的創(chuàng)建的一些基本操作,接下來(lái)討論下繼續(xù)討論。
一 工廠模式
我們知道,要?jiǎng)?chuàng)建一個(gè)對(duì)象我們可以用如下代碼:
var user = new Object(); //使用new運(yùn)算符創(chuàng)建一個(gè)對(duì)象 user.name = '念在三角湖畔'; //給對(duì)象添加屬性 user.age = 22; user.address = '湖北武漢'; alert(user.name + " " +user.age);//返回 '念在三角湖畔 湖北武漢'
用這樣的方法創(chuàng)建對(duì)象比較簡(jiǎn)單直觀,也是JavaScript種創(chuàng)建對(duì)象最基本的方法。但是這樣就有一個(gè)問(wèn)題,如果我們需要?jiǎng)?chuàng)建多個(gè)對(duì)象,那么我就得寫很多重復(fù)的代碼。比如我們想創(chuàng)建另一個(gè)對(duì)象user1,我們就得重新將上面的代碼重新寫一遍,這在實(shí)際開發(fā)過(guò)程中是不合適的,這樣如果對(duì)象過(guò)多,代碼量將大大增加。
為了解決這樣的問(wèn)題,我們可以使用一種叫做工廠模式的方法,這種方法 就是為了解決實(shí)例化對(duì)象產(chǎn)生大量重復(fù)代碼的問(wèn)題。
function create(name, age) { var obj = new Object(); obj.name = name; obj.age = age; obj.run = function () { return this.name +' '+ this.age; }; return obj; } var obj1= create('ZXC', 10); //第一個(gè)實(shí)例 var obj2= create('CXZ', 20); //第二個(gè)實(shí)例 alert(obj1.run()); alert(obj1.run());
從上面的代碼我們可以看出,工廠模式解決了實(shí)例化時(shí)代碼大量重復(fù)的問(wèn)題,但又出現(xiàn)了一個(gè)問(wèn)題,那就是識(shí)別問(wèn)題,我們根本無(wú)法弄清楚他們到底是哪個(gè)對(duì)象的實(shí)例。比如
alert(typeof obj1); //Object alert(obj1 instanceof Object); //true
以上代碼標(biāo)明box1是Object對(duì)象,但是我們無(wú)法知道具體是哪一個(gè)對(duì)象創(chuàng)建的。
二 構(gòu)造函數(shù)(構(gòu)造方法)
為了解決上面的問(wèn)題,我們可以用構(gòu)造方法去創(chuàng)建對(duì)象。構(gòu)造函數(shù)和普通函數(shù)的唯一區(qū)別,就是調(diào)用的方式不同。但是,構(gòu)造函數(shù)同樣是函 數(shù)。
function User(name, age) { //構(gòu)造函數(shù)模式 this.name = name; this.age = age; this.run = function () { return this.name + ' '+this.age; }; }
創(chuàng)建對(duì)象的時(shí)候用new運(yùn)算符就可以了:
var user1= new User('ZXC', 25); var user2= new User('CXZ', 22);
現(xiàn)在我們就可以檢測(cè)user1或者user2是不是屬于User。
alert(user1 instanceof User);//true
可見,使用構(gòu)造函數(shù)的方法,即解決了重復(fù)實(shí)例化的問(wèn)題,又解決了對(duì)象識(shí)別的問(wèn)題。
使用構(gòu)造函數(shù)時(shí)執(zhí)行的過(guò)程如下:
1.執(zhí)行 new 構(gòu)造函數(shù)()時(shí),后臺(tái)執(zhí)行了 new Object();
2.將構(gòu)造函數(shù)的作用域給新對(duì)象。
3.執(zhí)行構(gòu)造函數(shù)內(nèi)的代碼;
4.后臺(tái)直接返回新對(duì)象。
接下來(lái)我們看看構(gòu)造函數(shù)內(nèi)部的函數(shù)問(wèn)題。如果我們執(zhí)行以下語(yǔ)句:
alert(user1.run==user2.run);//結(jié)果返回的是false
結(jié)果返回的是false,這就說(shuō)明方法其實(shí)也是一種引用地址。如果我們同樣重復(fù)創(chuàng)建了多個(gè)對(duì)象,那么每個(gè)對(duì)象中的方法都會(huì)在內(nèi)存中開辟新的空間,這樣浪費(fèi)的空間就比較多。要解決這個(gè)問(wèn)題,我們就需要用到實(shí)例屬性或者方法的共享,下一篇文章中將繼續(xù)探討解決這個(gè)問(wèn)題。
以上所述是小編給大家介紹的Javascript中的對(duì)象和原型(二),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
禁用頁(yè)面部分JavaScript方法的具體實(shí)現(xiàn)
方法重寫,重寫要禁用的方法,并讓它什么也不做,結(jié)果證明真的可行,但并不知道是不是一個(gè)科學(xué)的方法,我拿出來(lái)與大家共同討論一下2013-07-07Web前端框架bootstrap實(shí)戰(zhàn)【第一次接觸使用】
Bootstrap是Twitter推出的一個(gè)開源的前端框架。這篇文章主要介紹了Web前端框架bootstrap實(shí)戰(zhàn),需要的朋友可以參考下2016-12-12javascript數(shù)組遍歷的方法實(shí)例分析
這篇文章主要介紹了javascript數(shù)組遍歷的方法,結(jié)合實(shí)例形式分析了javascript數(shù)組遍歷及相關(guān)的some、every、filter、map等方法的使用技巧,需要的朋友可以參考下2016-09-09JavaScript使用indexOf獲得子字符串在字符串中位置的方法
這篇文章主要介紹了JavaScript使用indexOf獲得子字符串在字符串中位置的方法,涉及javascript中indexOf方法操作字符串的技巧,需要的朋友可以參考下2015-04-04JS ListBox的簡(jiǎn)單功能實(shí)現(xiàn)代碼
這段時(shí)間在項(xiàng)目組都是做靜態(tài)頁(yè)面,都是些復(fù)制粘貼的活,難得碰到個(gè)稍微有點(diǎn)難度的頁(yè)面。后來(lái)看到這個(gè)頁(yè)面還不錯(cuò),可以自己做做看,雖然公司已經(jīng)有這樣的組件,但不想用,反正沒(méi)什么事,就當(dāng)多學(xué)學(xué)JS好了。2008-10-10JS簡(jiǎn)單生成兩個(gè)數(shù)字之間隨機(jī)數(shù)的方法
這篇文章主要介紹了JS簡(jiǎn)單生成兩個(gè)數(shù)字之間隨機(jī)數(shù)的方法,涉及javascript數(shù)值運(yùn)算的相關(guān)技巧,需要的朋友可以參考下2016-08-08小程序scroll-view組件實(shí)現(xiàn)滾動(dòng)的示例代碼
這篇文章主要介紹了小程序scroll-view組件實(shí)現(xiàn)滾動(dòng)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09微信小程序?qū)崿F(xiàn)授權(quán)登錄之獲取用戶信息
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)授權(quán)登錄之獲取用戶信息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05