這篇文章主要為大家展示了“JavaScript有哪些創(chuàng)建對象的方式”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“JavaScript有哪些創(chuàng)建對象的方式”這篇文章吧。
使用Object或者采用對象字面量的方法。
var o = {a: 1}; var o2=new Object(); o2.a=1;
缺點:使用同一個接口創(chuàng)建很多對象,會產(chǎn)生大量重復的代碼。
function parent(name,age){ var Child = new Object(); Child.name=name; Child.age=age; Child.sayHi=function(){ console.log("Hi"); } return Child; }; var x = Parent("Tom",12); console.log(x.name); //Tom x.sayHi(); //Hi
函數(shù)parent能夠根據(jù)接受的參數(shù)來構(gòu)建一個包含所有必要信息的child對象??梢詿o限次調(diào)用這個函數(shù),都會返回一個包含兩個屬性和一個方法的對象。
解決了創(chuàng)建多個相似對象的問題,但卻沒有解決對象識別的問題(即怎樣知道一個對象的類型)。
對于構(gòu)造函數(shù)這個名字,學過java或者c++的同學應(yīng)該都是知道的,在js里也是差不多的。
用構(gòu)造函數(shù)將上面的例子重寫如下:
function Parent(name,age){ this.name=name; this.age=age; this.sayHi=function(){ console.log("Hi"); }; } var x = new Parent("Tom",12); console.log(x.name); //Tom x.sayHi(); //Hi
對于構(gòu)造函數(shù),我們需要在調(diào)用的時候加關(guān)鍵字 new
。要注意的是,構(gòu)造函數(shù)始終是以一個大寫字母開頭,而非構(gòu)造函數(shù)始終是以一個小寫字母開頭。
與工廠模式相比,主要有以下幾個不同之處:
沒有顯示地創(chuàng)建對象;
直接將屬性和方法賦給了this對象;
沒有return
語句。
缺點:使用構(gòu)造函數(shù)的缺點就是每個方法都需要在每個實例上重新創(chuàng)建一遍。
我們創(chuàng)建的每一個函數(shù)都有一個prototype
(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共享的屬性與方法。使用原型對象的好處是可以讓所有的對象實例共享其包含的屬性與方法。
function Parent(name,age){ Parent.prototype.name=name; Parent.prototype.age=age; Parent.prototype.sayHi=function(){ console.log("Hi"); }; } var x = new Parent("Tom",12); console.log(x.name); //Tom x.sayHi(); //Hi
缺點:優(yōu)點就是其缺點,方法屬性都可以共享。具體可以看下面這個例子
function Parent(name,age){ Parent.prototype.name=name; Parent.prototype.age=age; Parent.prototype.arr=["123","we"]; Parent.prototype.sayHi=function(){ console.log("Hi"); }; } var x = new Parent("Tom",12); var y = new Parent("Tom1",12); x.arr.push("x"); y.arr.push("y"); console.log(x.arr);//["123", "we", "x", "y"] console.log(y.arr);//["123", "we", "x", "y"]
對象x修改自己的屬性,竟然會影響到y(tǒng)對象;同理,對y也一樣。這個明顯就很不合理啊,太可怕了!
function Parent(name,age){ //只把屬性留在這里定義,方法放在原型對象中 this.name=name; this.age=age; } //第一種方式 Parent.prototype.sayHi=function(){ console.log("Hi"); }; //第二種方式 //由于采用對象字面量,因此必須修正其constructor屬性; Parent.prototype={ constructor:Parent, sayHi:function(){ console.log("Hi"); } } var x = new Parent("Tom",12); console.log(x.name); //Tom x.sayHi(); //Hi
在這個例子中,實例屬性都是在構(gòu)造函數(shù)中定義的,而由所有實例共享的屬性constructor
和方法則是在原型中定義的。
是目前使用最廣泛、認同度最高的一種創(chuàng)建自定義類型的方法。
--------------------------感覺后面幾種方法有些變態(tài)了--------------------------------
function Parent(name,age){ this.name=name; this.age=age; if( typeof this.sayHi !="function"){ Parent.prototype.sayHi=function(){ console.log("Hi"); }; } } var x = new Parent("Tom",12); console.log(x.name); //Tom x.sayHi(); //Hi
先檢查某個應(yīng)該存在方法是否有效再來決定是否需要初始化原型。
當前面幾種都不適用的情況下,可以使用寄生構(gòu)造函數(shù)模式。這種函數(shù)的基本思想是創(chuàng)建一個函數(shù),該函數(shù)的作用僅僅是封裝創(chuàng)建對象的代碼,然后再返回新創(chuàng)建的對象。
function parent(name,age){ var Child = new Object(); Child.name=name; Child.age=age; Child.sayHi=function(){ console.log("Hi"); } return Child; }; var x = Parent("Tom",12); console.log(x.name); //Tom x.sayHi(); //Hi
但是其實就是和工廠模式一模一樣,你TM在逗我嗎?????
穩(wěn)妥構(gòu)造函數(shù)遵循與寄生構(gòu)造函數(shù)模式類似的模式,但有兩點不同:一是新創(chuàng)建對象的實例方法不引用this
; 二是不使用new
操作調(diào)用構(gòu)造函數(shù)。
function Parent(name,age){ var o=new Object(); //私有變量或者方法 var name=name, age=age; o.sayName=function(){ //name前面沒有this console.log(name+" "+age) } return o; } var x = Parent("Tom",12); x.sayName(); //Tom 12
變量x中保存的是一個穩(wěn)妥對象,而除了調(diào)用sayName()
方法外,沒有別的方式可以訪問其數(shù)據(jù)成員。
以上是“JavaScript有哪些創(chuàng)建對象的方式”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章標題:JavaScript有哪些創(chuàng)建對象的方式-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://jinyejixie.com/article28/cccjjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、定制網(wǎng)站、網(wǎng)站營銷、品牌網(wǎng)站制作、網(wǎng)站制作、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)