這篇文章給大家分享的是有關(guān)JavaScript如何實現(xiàn)創(chuàng)建自定義對象的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
為宛城等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及宛城網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站設(shè)計、宛城網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
具體如下:
對象字面量方式是創(chuàng)建自定義對象的首選模式,簡單方便。
var per = { name:'zhangsan', age:25, job:'html', sayName:function(){ alert(this.name); } }
缺點:使用同一個接口創(chuàng)建很多對象,會產(chǎn)生大量的重復(fù)代碼。比如我想再創(chuàng)建一個per1對象,我就得把上面的代碼再重新寫一遍,改變不同的屬性值。
工廠模式抽象了創(chuàng)建具體對象的過程。由于在ECMAScript中無法創(chuàng)建類,開發(fā)人員就發(fā)明了一種函數(shù),用函數(shù)來封裝以特定接口創(chuàng)建對象的細節(jié),如下面的例子:
function createPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); } return o; } var person1 = createPerson('zhang',30,'java'); var person2 = createPerson('zhao',25,'php');
函數(shù)createPerson()
能夠根據(jù)接受到的參數(shù)來構(gòu)建一個包含所有必要信息的Person對象??梢詿o數(shù)次的調(diào)用這個函數(shù),而每次它都會返回一個包含三個屬性和一個方法的對象。
缺點:工廠模式雖然解決了創(chuàng)建多個相似對象的問題,但卻沒有解決對象識別的問題(即怎樣知道一個對象的類型)。
可以使用構(gòu)造函數(shù)模式將前面的例子重寫如下:
function Person(name,age,job){ this.name= name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); } } var person1 = new Person('zhang',30,'java'); var person2 = new Person('zhao',25,'php');
創(chuàng)建自定義的構(gòu)造函數(shù)意味著將來可以將它的實例標(biāo)識為一種特定的類型。而這正是構(gòu)造函數(shù)模式勝過工廠模式的地方。
然而,使用構(gòu)造函數(shù)的主要問題,就是每個方法都要在每個實例上重新創(chuàng)建一遍。在上面的例子中,person1和person2都有一個名為sayName()
的方法,但那兩個方法不是同一個Function的實例,創(chuàng)建兩個完成同樣任務(wù)的Function實例的確沒有必要;況且有this對象在,根本不用在執(zhí)行代碼前就把函數(shù)綁定到特定對象上面。因此可以像下面這樣,通過把函數(shù)定義轉(zhuǎn)移到構(gòu)造函數(shù)外部來解決這個問題。
function Person(name,age,job){ this.name= name; this.age = age; this.job = job; this.sayName = sayName(); } function sayName(){ alert(this.name); } var person1 = createPerson('zhang',30,'java'); var person2 = createPerson('zhao',25,'php');
在這個例子中,我們把sayName()
函數(shù)的定義轉(zhuǎn)移到構(gòu)造函數(shù)外部。而在構(gòu)造函數(shù)內(nèi)部,我們將sayName屬性設(shè)置成等于全局的sayName函數(shù),這樣person1和person2對象就共享了在全局作用域中定義的同一個sayName()
函數(shù)。這樣確實解決了兩個函數(shù)在做同一件事的問題,可是新問題又來了:在全局作用域中定義的函數(shù)實際上只能被某個對象調(diào)用,這讓全局作用域有點名不副實。更讓人無法接受的是:如果對象需要定義很多方法,那么就要定義很多全局函數(shù)。好在,這些問題可以通過使用原型模式來解決。
我們創(chuàng)建的每個函數(shù)都有一個prototype(原型)
屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共享的屬性和方法。使用原型對象的好處是可以讓所有的對象實例共享他所包含的屬性和方法。
function Person(){} Person.prototype.name = 'zhang'; Person.prototype.age = '22'; Person.prototype.job = 'html5'; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); var person2 = new Person();
原型模式也不是沒有缺點。首先,它省略了為構(gòu)造函數(shù)傳遞初始化參數(shù)這一環(huán)節(jié),結(jié)果所有實例在默認情況下都將取得相同的屬性值。雖然這會在某種程度上帶來一些不方便,但還不是原型的最大問題。原型模式的最大問題是由共享的本性所導(dǎo)致的。
原型中所有屬性是被很多實例共享的,這種共享對于函數(shù)非常合適。對于那些包含基本值的屬性倒也說的過去,通過在實例上添加一個同名屬性,可以隱藏原型中的對應(yīng)屬性。然后,對于包含引用類型的屬性來說,問題就比較突出了。
function Person(){} Person.prototype = { constructor:Person, name:'zhang', age :'22', job :'html5', friends:['wang','li'], sayName : function(){ alert(this.name); } }; var person1 = new Person(); var person2 = new Person(); person1.friends.push('zhao'); alert(person1.friends); //'wang,li,zhao' alert(person2.friends); //'wang,li,zhao' alert(person1.friends === person2.friends); //true
從上面的打印的結(jié)果我們就可以知道為什么很少人單獨使用原型模式了,實例一般都是要有屬于自己的全部屬性的。
組合使用構(gòu)造函數(shù)模式和原型模式,是創(chuàng)建自定義類型的最常見方式。構(gòu)造函數(shù)模式用于定義實例屬性,而原型模式用于定義方法和共享的屬性。結(jié)果,每個實例都會有自己的一份實例屬性的副本,但同時又共享著對方法的引用,最大限度的節(jié)省了內(nèi)存。
function Person(name,age,job){ this.name= name; this.age = age; this.job = job; this.friends = ['wang','li']; } Person.prototype = { constructor:Person, sayName : function(){ alert(this.name); } } var person1 = new Person('zhang',26,'java',); var person2 = new Person('sun',25,'php'); person1.friends.push('zhao'); alert(person1.friends); //'wang,li,zhao' alert(person2.friends); //'wang,li' alert(person1.friends === person2.friends); //false
在上面的例子中,實例屬性都是在構(gòu)造函數(shù)中定義的,而由所有實例共享的屬性constructor
和方法satName()
則是在原型中定義的。而修改了person1.friends
(向其中添加一個新字符串),并不會影響到person2.friends
,因為他們分別引用了不同的數(shù)組。
感謝各位的閱讀!關(guān)于“JavaScript如何實現(xiàn)創(chuàng)建自定義對象”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!