• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

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

    來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:11:48
    文檔

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

    JavaScript實(shí)現(xiàn)創(chuàng)建自定義對象的常用方式總結(jié):本文實(shí)例講述了JavaScript實(shí)現(xiàn)創(chuàng)建自定義對象的常用方式。分享給大家供大家參考,具體如下: 1. 對象字面量方式 對象字面量方式是創(chuàng)建自定義對象的首選模式,簡單方便。 var per = { name:'zhangsan', age:25, job:'html', sayName
    推薦度:
    導(dǎo)讀JavaScript實(shí)現(xiàn)創(chuàng)建自定義對象的常用方式總結(jié):本文實(shí)例講述了JavaScript實(shí)現(xiàn)創(chuàng)建自定義對象的常用方式。分享給大家供大家參考,具體如下: 1. 對象字面量方式 對象字面量方式是創(chuàng)建自定義對象的首選模式,簡單方便。 var per = { name:'zhangsan', age:25, job:'html', sayName

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

    1. 對象字面量方式

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

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

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

    2、工廠模式

    工廠模式抽象了創(chuàng)建具體對象的過程。由于在ECMAScript中無法創(chuàng)建類,開發(fā)人員就發(fā)明了一種函數(shù),用函數(shù)來封裝以特定接口創(chuàng)建對象的細(xì)節(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對象。可以無數(shù)次的調(diào)用這個函數(shù),而每次它都會返回一個包含三個屬性和一個方法的對象。

    缺點(diǎn):工廠模式雖然解決了創(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ù)意味著將來可以將它的實(shí)例標(biāo)識為一種特定的類型。而這正是構(gòu)造函數(shù)模式勝過工廠模式的地方。

    然而,使用構(gòu)造函數(shù)的主要問題,就是每個方法都要在每個實(shí)例上重新創(chuàng)建一遍。在上面的例子中,person1和person2都有一個名為sayName()的方法,但那兩個方法不是同一個Function的實(shí)例,創(chuàng)建兩個完成同樣任務(wù)的Function實(shí)例的確沒有必要;況且有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ù)在做同一件事的問題,可是新問題又來了:在全局作用域中定義的函數(shù)實(shí)際上只能被某個對象調(diào)用,這讓全局作用域有點(diǎn)名不副實(shí)。更讓人無法接受的是:如果對象需要定義很多方法,那么就要定義很多全局函數(shù)。好在,這些問題可以通過使用原型模式來解決。

    4、原型模式

    我們創(chuàng)建的每個函數(shù)都有一個prototype(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實(shí)例共享的屬性和方法。使用原型對象的好處是可以讓所有的對象實(shí)例共享他所包含的屬性和方法。

    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();
    
    

    原型模式也不是沒有缺點(diǎn)。首先,它省略了為構(gòu)造函數(shù)傳遞初始化參數(shù)這一環(huán)節(jié),結(jié)果所有實(shí)例在默認(rèn)情況下都將取得相同的屬性值。雖然這會在某種程度上帶來一些不方便,但還不是原型的最大問題。原型模式的最大問題是由共享的本性所導(dǎo)致的。

    原型中所有屬性是被很多實(shí)例共享的,這種共享對于函數(shù)非常合適。對于那些包含基本值的屬性倒也說的過去,通過在實(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é)果我們就可以知道為什么很少人單獨(dú)使用原型模式了,實(shí)例一般都是要有屬于自己的全部屬性的。

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

    組合使用構(gòu)造函數(shù)模式和原型模式,是創(chuàng)建自定義類型的最常見方式。構(gòu)造函數(shù)模式用于定義實(shí)例屬性,而原型模式用于定義方法和共享的屬性。結(jié)果,每個實(shí)例都會有自己的一份實(shí)例屬性的副本,但同時又共享著對方法的引用,最大限度的節(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
    
    

    在上面的例子中,實(shí)例屬性都是在構(gòu)造函數(shù)中定義的,而由所有實(shí)例共享的屬性constructor和方法satName()則是在原型中定義的。而修改了person1.friends(向其中添加一個新字符串),并不會影響到person2.friends,因?yàn)樗麄兎謩e引用了不同的數(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é)運(yùn)算用法總結(jié)》

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

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

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

    JavaScript實(shí)現(xiàn)創(chuàng)建自定義對象的常用方式總結(jié):本文實(shí)例講述了JavaScript實(shí)現(xiàn)創(chuàng)建自定義對象的常用方式。分享給大家供大家參考,具體如下: 1. 對象字面量方式 對象字面量方式是創(chuàng)建自定義對象的首選模式,簡單方便。 var per = { name:'zhangsan', age:25, job:'html', sayName
    推薦度:
    標(biāo)簽: 方法 js 常用的
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 欧美日韩人妻精品一区二区在线| 亚洲av成人无码久久精品 | 99re只有精品8中文| 无码日韩精品一区二区免费| 国产精品自在在线午夜福利| 91精品国产高清久久久久久io| 亚洲性日韩精品一区二区三区| 国产精品第六页| 欧美精品国产精品| .精品久久久麻豆国产精品| 亚洲国产精品无码久久98| 99久久国产综合精品麻豆| 国产精品片在线观看手机版| 国产成人精品高清在线观看99| 亚洲AV乱码久久精品蜜桃| 青青草97国产精品免费观看| 国产三级精品久久| 国产高清国内精品福利99久久| 久久97精品久久久久久久不卡| 成人伊人精品色XXXX视频| 日韩精品无码一区二区三区不卡 | 国产乱人伦偷精品视频免下载| 呦交小u女国产精品视频| 久久精品国产WWW456C0M| 国产免费伦精品一区二区三区| 亚洲综合精品香蕉久久网97| 国产精品久久久久久久久鸭| 国产成人久久精品激情| 精品欧洲AV无码一区二区男男| 久久久久久亚洲Av无码精品专口| 亚洲av无码精品网站| 久久香蕉国产线看观看精品yw| 日韩精品中文字幕无码一区| 老汉精品免费AV在线播放| 久久发布国产伦子伦精品| 精品国产一区AV天美传媒 | 欧美精品VIDEOSSEX少妇| 久久国产精品一国产精品金尊 | 亚洲国产另类久久久精品小说 | 91久久精品国产91性色也| 国产精品欧美久久久久无广告|