欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript實現(xiàn)創(chuàng)建自定義對象的常用方式總結(jié)

 更新時間:2018年07月09日 11:00:15   作者:zhang070514  
這篇文章主要介紹了JavaScript實現(xiàn)創(chuàng)建自定義對象的常用方式,結(jié)合實例形式總結(jié)分析了JavaScript工廠模式、構(gòu)造函數(shù)模式、原型模式、組合模式等常用的自定義對象創(chuàng)建模式操作與使用技巧,需要的朋友可以參考下

本文實例講述了JavaScript實現(xiàn)創(chuàng)建自定義對象的常用方式。分享給大家供大家參考,具體如下:

1. 對象字面量方式

對象字面量方式是創(chuàng)建自定義對象的首選模式,簡單方便。

var per = {
 name:'zhangsan',
 age:25,
 job:'html',
 sayName:function(){
  alert(this.name);
 }
}

缺點:使用同一個接口創(chuàng)建很多對象,會產(chǎn)生大量的重復(fù)代碼。比如我想再創(chuàng)建一個per1對象,我就得把上面的代碼再重新寫一遍,改變不同的屬性值。

2、工廠模式

工廠模式抽象了創(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)建多個相似對象的問題,但卻沒有解決對象識別的問題(即怎樣知道一個對象的類型)。

3、構(gòu)造函數(shù)模式

可以使用構(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ù)。好在,這些問題可以通過使用原型模式來解決。

4、原型模式

我們創(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é)果所有實例在默認(rèn)情況下都將取得相同的屬性值。雖然這會在某種程度上帶來一些不方便,但還不是原型的最大問題。原型模式的最大問題是由共享的本性所導(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é)果我們就可以知道為什么很少人單獨使用原型模式了,實例一般都是要有屬于自己的全部屬性的。

5、組合使用構(gòu)造函數(shù)模式和原型模式

組合使用構(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相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運算用法總結(jié)

希望本文所述對大家JavaScript程序設(shè)計有所幫助。

相關(guān)文章

  • JavaScript關(guān)聯(lián)數(shù)組用法分析【概念、定義、遍歷】

    JavaScript關(guān)聯(lián)數(shù)組用法分析【概念、定義、遍歷】

    這篇文章主要介紹了JavaScript關(guān)聯(lián)數(shù)組用法,結(jié)合實例形式分析了關(guān)聯(lián)數(shù)組的概念、定義與遍歷操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-03-03
  • 原生JS實現(xiàn)多條件篩選

    原生JS實現(xiàn)多條件篩選

    這篇文章主要為大家詳細介紹了原生JS實現(xiàn)多條件篩選,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • uniapp實現(xiàn)審批流程的具體操作步驟

    uniapp實現(xiàn)審批流程的具體操作步驟

    這篇文章主要介紹了uniapp實現(xiàn)審批流程的具體操作方法,實現(xiàn)思路大概是需要要定義一個變量,記錄當(dāng)前激活的步驟,通過數(shù)組的長度來循環(huán)數(shù)據(jù),如果有就采用3元一次進行選擇,具體實現(xiàn)步驟跟隨小編一起看看吧
    2024-03-03
  • 微信開發(fā)之企業(yè)付款到銀行卡接口開發(fā)的示例代碼

    微信開發(fā)之企業(yè)付款到銀行卡接口開發(fā)的示例代碼

    這篇文章主要介紹了微信開發(fā)之企業(yè)付款到銀行卡接口開發(fā)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • 超級簡易的JS計算器實例講解(實現(xiàn)加減乘除)

    超級簡易的JS計算器實例講解(實現(xiàn)加減乘除)

    下面小編就為大家?guī)硪黄壓喴椎腏S計算器實例講解(實現(xiàn)加減乘除)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • layui問題之模擬select點擊事件的實例講解

    layui問題之模擬select點擊事件的實例講解

    今天小編就為大家分享一篇layui問題之模擬select點擊事件的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • ?javascript數(shù)組中的slice方法和join??方法

    ?javascript數(shù)組中的slice方法和join??方法

    這篇文章主要介紹了?javascript數(shù)組中的slice方法和join??方法,文章內(nèi)容介紹詳細,具有一的參考價值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-03-03
  • JS基于正則表達式實現(xiàn)的密碼強度驗證功能示例

    JS基于正則表達式實現(xiàn)的密碼強度驗證功能示例

    這篇文章主要介紹了JS基于正則表達式實現(xiàn)的密碼強度驗證功能,涉及javascript事件響應(yīng)及基于正則的字符遍歷、判斷等相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • JS?中在嚴(yán)格模式下?this?的指向問題

    JS?中在嚴(yán)格模式下?this?的指向問題

    這篇文章主要介紹了JS?中在嚴(yán)格模式下this的指向問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 小程序自定義圓形進度條

    小程序自定義圓形進度條

    這篇文章主要為大家詳細介紹了小程序自定義圓形進度條,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評論