<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        JS常見構(gòu)造模式實例對比分析

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

        JS常見構(gòu)造模式實例對比分析

        JS常見構(gòu)造模式實例對比分析:本文實例分析了JS常見構(gòu)造模式。分享給大家供大家參考,具體如下: 1.工廠模式 沒有解決對象識別的問題。因為函數(shù)內(nèi)部使用了new Object來創(chuàng)建對象 function Factory(name,age) { var o=new Object(); o.name=name; o.age=age;
        推薦度:
        導讀JS常見構(gòu)造模式實例對比分析:本文實例分析了JS常見構(gòu)造模式。分享給大家供大家參考,具體如下: 1.工廠模式 沒有解決對象識別的問題。因為函數(shù)內(nèi)部使用了new Object來創(chuàng)建對象 function Factory(name,age) { var o=new Object(); o.name=name; o.age=age;

        本文實例分析了JS常見構(gòu)造模式。分享給大家供大家參考,具體如下:

        1.工廠模式

        沒有解決對象識別的問題。因為函數(shù)內(nèi)部使用了new Object來創(chuàng)建對象

        function Factory(name,age)
        {
         var o=new Object();
         o.name=name;
         o.age=age;
         o.what=what;//用函數(shù)引用的方式消除重復創(chuàng)建相同函數(shù)的弊端,節(jié)省資源.函數(shù)引用可以修改this的指向,函數(shù)調(diào)用不可以!
         return o;
        }
        what=funciton()
        {
         alert(this.name+this.age);
        }
        var o=Factory("12",12);
        o.what();//what中的this指向o對象
        
        

        這時候的constructor是Object,同時所有通過工廠模式返回的對象都是Object類型,所以instanceof操作符沒有意義

        console.log(o.constructor);
        //打印function Object() { [native code] }
        console.log(o instanceof Object);
        //而且這時候所有的對象都是Object類型的
        
        

        2.構(gòu)造函數(shù)模式

        function Person(name,age)
        {
        this.name=name;
        this.age=age;
        this.sayName=function(){ alert(this.name);}//相當于this.sayName=new Function("alert(this.name)")
        }
        var p1=new Person("xx",12);
        var p2=new Person("yy",13);
        alert(p1.sayName==p2.sayName)//內(nèi)存地址不一樣!返回false
        
        

        構(gòu)造函數(shù)相比工廠模式的優(yōu)點在于能夠正確的返回對象的類型,instanceof返回正確的結(jié)果。缺點在于如果向上面那樣,那么在每一個對象上面都要有一個sayName方法,而且這些sayName方法不是同一個Function實例,因為ECMAScript中函數(shù)是對象,因此每定義一個函數(shù),也就是實例化了一個對象!

        對上面的方法進行優(yōu)化:

        function Person(name,age)
        {
        this.name=name;
        this.age=age;
        this.sayName=sayName;//函數(shù)引用的方法,共享了同一個sayName,p1,p2的內(nèi)存地址一樣,p1.sayName==p2.sayName返回true
        }
        function sayName()
        {
        alert(this.name);
        }
        
        

        缺點:全局函數(shù)sayName只能被某個對象調(diào)用p1.sayName,讓全局函數(shù)名不副實;如果對象要定義很多方法,那么就要定義很多的全局函數(shù),所以自定義的引用類型沒有封裝性可言

        3.原型模式

        (1)無法通過構(gòu)造函數(shù)參數(shù)向原型屬性動態(tài)傳值,后果就是:沒有個性,改變原型屬性的值,所有的實例都會受到干擾!

        (2)當原型屬性的是引用類型的時候,如果在一個對象實例上修改屬性,將會影響所有實例!

        總之一句話:牽一發(fā)而動全身(包括屬性和引用類型的值)是原型模式的特點。但是相比于構(gòu)造函數(shù)類型,原型類型滿足

        person1.sayName===person2.sayName//兩者的引用是一樣的
        
        

        4.構(gòu)造函數(shù)原型模式

        用構(gòu)造函數(shù)定義個性,用原型模式定義共性

        function Person(name,age)
        {
         this.name=name;
         this.age=age;
         this.friends=['liangklfang','qinliang'];
        }
        //用原型定義共性
        Person.prototype={
         constructor:Person,
         sayName:function()
         {
         console.log(this.name);
         }
        }
        var person1=new Person('liangklfang',"12");
        var person2=new Person('liangklf',"14");
        console.log(person1.sayName===person2.sayName);
        //共性是函數(shù),打印true
        console.log(person1.friends===person2.friends);
        //friends是個性,打印false
        
        

        也可以對構(gòu)造函數(shù)原型模式進行優(yōu)化,就是常說的動態(tài)原型模式

        function Book(title,page)
        {
         this.title=title;
         this.page=page;
         if(typeof Book.isLock=="undefined")
        //第一次的時候,Book.isLock是undefined,給原型綁定函數(shù),以后就不需要了,他相比于構(gòu)造函數(shù)原型模式的優(yōu)點在于把所有的邏輯全部封裝到構(gòu)造函數(shù)里面!
         {
         alert("Enter!");
        Book.prototype.what=function() 
         {
         alert(this.title+this.pages);
         }
         Book.isLock=true;
         }
        }
        //下面的兩次調(diào)用alert("Enter!")只會調(diào)用因此i,因為第一次已經(jīng)通過Book.isLock設置為true了!相當于靜態(tài)方法!;
        var b1=new Book("me",12);
        b1.what();
        var b2=new Book("he",13);
        b2.what();
        
        

        也可以在this中直接檢測,而不用給函數(shù)對象一個屬性

        function Book(title,page)
        {
         this.title=title;
         this.page=page;
         if(typeof this.sayName!='function')
         //第二次構(gòu)造對象的時候會在原型中查找到sayName!
         {
         Book.prototype.sayName=function()
         {
         console.log(this.title);
         }
         }
        }
        
        

        5.寄生構(gòu)造函數(shù)模式

        除了使用new操作符以外,和工廠設計模式是一模一樣的!可以在特殊的情況下為對象創(chuàng)建構(gòu)造函數(shù),例如想用構(gòu)造函數(shù)方式創(chuàng)建一個具有額外方法的特殊數(shù)組,因為不能直接修改Array的構(gòu)造函數(shù),因此可以用這個模式!

        function SpecialArray()
        {
         var value=new Array();
         value.push.apply(value,arguments);
         value.toPipedString=function()
         {
         return this.join("|");
        }
         return value;
        }
        
        

        總之,寄生構(gòu)造函數(shù)的特點就是:有點像java中的裝飾模式!把原來的對象進行裝飾,同時返回裝飾后的對象!這里就是把Array對象進行了裝飾!添加了toPipe的String方法。缺點就是不能依賴instanceof操作符確定對象類型了,因為和不再包裝類里面創(chuàng)建的對象是一模一樣的!

        6. 穩(wěn)妥構(gòu)造函數(shù)模式

        特點:沒有公共屬性,而且其方法也不引用this的對象,instanceof失效。和寄生構(gòu)造函數(shù)的不同在于不使用new來構(gòu)造函數(shù),同時實例方法不引用this。實際是閉包

        function Person(name,age,job)
        {
         var o=new Object();
         o.sayName=funciton(){alert(name)}//這里實例方法沒有引用this,除了sayName不會有方法訪問傳入到構(gòu)造函數(shù)中的原始數(shù)據(jù)!
         return o;
        }
        var friend=Person("xx",12,"teacher");
        friend.name="female";//即使可以為這個對象修改了屬性name
        friend.sayName();//不會被修改,依然彈出xx。不是female。但是,如果把上面的修改成:o.sayName=function(){alert(this.name)}//那么就會彈出female,也就是friend.name被修改成功了,如果沒有this,那么name的值一直引用的是原來的參數(shù)值!
        
        

        感興趣的朋友還可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試運行上述js代碼。

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

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

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

        文檔

        JS常見構(gòu)造模式實例對比分析

        JS常見構(gòu)造模式實例對比分析:本文實例分析了JS常見構(gòu)造模式。分享給大家供大家參考,具體如下: 1.工廠模式 沒有解決對象識別的問題。因為函數(shù)內(nèi)部使用了new Object來創(chuàng)建對象 function Factory(name,age) { var o=new Object(); o.name=name; o.age=age;
        推薦度:
        標簽: 模式 js 示例
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 911精品国产亚洲日本美国韩国| 亚洲AV无码一区二区三区牛牛| 日韩精品人妻系列无码专区免费| 亚洲免费中文字幕| 四虎影永久在线高清免费| 插鸡网站在线播放免费观看| 亚洲男女一区二区三区| 国产一区二区三区免费在线观看| 免费一级毛片无毒不卡| 亚洲中文字幕久久久一区| 亚洲最大激情中文字幕| 欧美日韩国产免费一区二区三区| 深夜福利在线视频免费| 亚洲色av性色在线观无码| 成人亚洲综合天堂| 91精品成人免费国产片| 午夜不卡AV免费| 色在线亚洲视频www| 亚洲中文字幕日产乱码高清app| 永久免费av无码不卡在线观看| 国产高清对白在线观看免费91| 国产精品亚洲精品| 亚洲人成亚洲人成在线观看| 免费的一级片网站| 午夜老司机永久免费看片| 免费一级毛片在线播放视频免费观看永久 | 国产精品亚洲二区在线| 久久综合亚洲鲁鲁五月天| 国产亚洲自拍一区| 国产成人免费a在线视频app | 成人免费a级毛片| 久久久久国产精品免费免费不卡| 国产大陆亚洲精品国产| 亚洲一级片在线观看| 久久国产亚洲观看| 国产a v无码专区亚洲av| 精品久久久久久久免费人妻| 国产一卡二卡四卡免费| 一区二区三区在线免费看| 国产JIZZ中国JIZZ免费看| 国产亚洲综合精品一区二区三区|