成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javascript面向?qū)ο蟮某R?jiàn)寫法與優(yōu)缺點(diǎn)

Ajian / 3429人閱讀

摘要:我們通過(guò)表單驗(yàn)證的功能,來(lái)逐步演進(jìn)面向?qū)ο蟮姆绞綄?duì)于剛剛接觸的朋友來(lái)說(shuō),如果要寫一個(gè)驗(yàn)證用戶名,密碼,郵箱的功能,一般可能會(huì)這么寫表單驗(yàn)證全局全局全局這種寫法,從功能上來(lái)說(shuō)沒(méi)有什么問(wèn)題,但是在團(tuán)隊(duì)協(xié)作的時(shí)候,會(huì)造成覆蓋全局變量的問(wèn)題,那要大

我們通過(guò)表單驗(yàn)證的功能,來(lái)逐步演進(jìn)面向?qū)ο蟮姆绞? 對(duì)于剛剛接觸javascript的朋友來(lái)說(shuō),如果要寫一個(gè)驗(yàn)證用戶名,密碼,郵箱的功能, 一般可能會(huì)這么寫:

 1         //表單驗(yàn)證
 2         var checkUserName = function(){
 3             console.log( "全局checkUserName" );
 4         };
 5         var checkUserEmail = function(){
 6             console.log( "全局checkUserEmail" );
 7         };
 8         var checkUserPwd = function(){
 9             console.log( "全局checkUserPwd" );
10         };

這種寫法,從功能上來(lái)說(shuō) 沒(méi)有什么問(wèn)題, 但是在團(tuán)隊(duì)協(xié)作的時(shí)候, 會(huì)造成覆蓋全局變量的問(wèn)題, 那要大大降低覆蓋的可能性, 一般會(huì)在外面套一個(gè)對(duì)象

 1         var Utils = {
 2             checkUserName : function(){
 3                 console.log( "Utils->checkUserName" );
 4             },
 5             checkUserEmail : function(){
 6                 console.log( "Utils->checkUserEmail" );
 7             },
 8             checkUserPwd :  function(){
 9                 console.log( "Utils->checkUserPwd" );
10             }
11         }
12 
13         checkUserEmail();
14         Utils.checkUserEmail();

上面這種方式,是字面量方式添加,在設(shè)計(jì)模式里面,也稱為單例(單體)模式, 與之類似的可以通過(guò)在函數(shù)本身添加屬性和方法,變成靜態(tài)屬性和方法,達(dá)到類似的效果:

1         var Utils = function(){
 2 
 3         }
 4         Utils.checkUserName = function(){
 5             console.log( "Utils.checkUserName" );
 6         }
 7         Utils.checkUserPwd = function(){
 8             console.log( "Utils.checkUserPwd" );
 9         }
10         Utils.checkUserEmail = function(){
11             console.log( "Utils.checkUserEmail" );
12         }
13 
14         Utils.checkUserEmail();
15 
16         for( var key in Utils ){
17             ( Utils.hasOwnProperty( key ) ) ? console.log( key ) : "";
18         }
19 
20         //加在函數(shù)上面的屬性和方法,無(wú)法通過(guò)對(duì)象使用
21         var oUtil = new Utils(); 
22         oUtil.checkUserEmail();//錯(cuò)誤

還可以通過(guò)函數(shù)調(diào)用方式,返回一個(gè)對(duì)象,把方法和屬性寫在對(duì)象中, 這種方式 跟面向?qū)ο鬀](méi)有什么關(guān)系,只是從函數(shù)的返回值角度來(lái)改造

1         //使用函數(shù)的方式 返回一個(gè)對(duì)象
 2         var Util = function(){
 3             return {
 4                 checkUserName : function(){
 5                     console.log( "userName..." );
 6                 },
 7                 checkUserPwd : function(){
 8                     console.log( "userPwd..." );
 9                 },
10                 checkUserEmail : function(){
11                     console.log( "userEmail..." );
12                 }
13             }
14         }
15         Util().checkUserEmail();

還可以通過(guò)類似傳統(tǒng)面向?qū)ο笳Z(yǔ)言,使用構(gòu)造函數(shù)方式 為每個(gè)實(shí)例添加方法和屬性, 這種方式,存在一個(gè)問(wèn)題, 不能達(dá)到函數(shù)共用,每個(gè)實(shí)例都會(huì)復(fù)制到方法.

1         var Util = function(){
 2             this.checkUserName = function(){
 3                 console.log("userName");
 4             };
 5             this.checkUserEmail = function(){
 6                 console.log("userEmail");
 7             };
 8             this.checkUserPwd = function(){
 9                 console.log("userPwd");
10             };
11         }
12 
13         var oUtil1 = new Util();
14         var oUtil2 = new Util();
15         console.log( oUtil1.checkUserEmail === oUtil2.checkUserEmail );//false
一般,我們可以通過(guò)原型屬性(prototype)改造這種方式,達(dá)到不同實(shí)例共用同一個(gè)方法

 1         var Util = function(){
 2             
 3         };
 4         Util.prototype.checkUserName = function(){
 5             console.log("userName");
 6         };
 7         Util.prototype.checkUserPwd = function(){
 8             console.log("userPwd");
 9         };
10         Util.prototype.checkUserEmail = function(){
11             console.log("userEmail");
12         };
13         var oUtil1 = new Util();
14         var oUtil2 = new Util();
15         console.log( oUtil1.checkUserEmail === oUtil2.checkUserEmail );//true

也可以把原型對(duì)象上的所有方法,使用字面量方式簡(jiǎn)寫

1         var Util = function(){
 2             
 3         };
 4         Util.prototype = {
 5             checkUserEmail : function(){
 6                 console.log( "userEmail" );
 7             },
 8             checkUserName : function(){
 9                 console.log( "userName" );
10             },
11             checkUserPwd : function(){
12                 console.log( "userPwd" );
13             }
14         };
15         var oUtil1 = new Util();
16         var oUtil2 = new Util();
17         console.log( oUtil1.checkUserEmail === oUtil2.checkUserEmail );//true

注意: 字面量方式和原型對(duì)象一個(gè)個(gè)添加 這兩種不要混用, 否則會(huì)產(chǎn)生覆蓋

如果我們想把面向?qū)ο蟮氖褂梅绞礁拥膬?yōu)雅,比如鏈?zhǔn)秸{(diào)用, 我們應(yīng)該在每個(gè)方法中返回對(duì)象本身,才能繼續(xù)調(diào)用方法, 即返回this

1         var Util = function(){
 2             return {
 3                 checkUserName : function(){
 4                     console.log( "userName..." );
 5                     return this;
 6                 },
 7                 checkUserPwd : function(){
 8                     console.log( "userPwd..." );
 9                     return this;
10                 },
11                 checkUserEmail : function(){
12                     console.log( "userEmail..." );
13                     return this;
14                 }
15             }
16         }
17         // 方法中如果沒(méi)有返回this,下面這種調(diào)用方式是錯(cuò)誤的
18         Util().checkUserEmail().checkUserName();
19 
20         // 方法中返回對(duì)象本身,可以鏈?zhǔn)秸{(diào)用
21         Util().checkUserEmail().checkUserName().checkUserPwd();
 1         var Util = function(){
 2             this.checkUserName = function(){
 3                 console.log("userName");
 4                 return this;
 5             };
 6             this.checkUserEmail = function(){
 7                 console.log("userEmail");
 8                 return this;
 9             };
10             this.checkUserPwd = function(){
11                 console.log("userPwd");
12                 return this;
13             };
14         }
15 
16         new Util().checkUserEmail().checkUserName().checkUserPwd();
        var Util = function(){
            
        };
        Util.prototype = {
            checkUserEmail : function(){
                console.log( "userEmail" );
                return this;
            },
            checkUserName : function(){
                console.log( "userName" );
                return this;
            },
            checkUserPwd : function(){
                console.log( "userPwd" );
                return this;
            }
        };

        new Util().checkUserEmail().checkUserName().checkUserPwd();
 1         var Util = function(){
 2             
 3         };
 4         Util.prototype.checkUserName = function(){
 5             console.log("userName");
 6             return this;
 7         };
 8         Util.prototype.checkUserPwd = function(){
 9             console.log("userPwd");
10             return this;
11         };
12         Util.prototype.checkUserEmail = function(){
13             console.log("userEmail");
14             return this;
15         };
16 
17         new Util().checkUserEmail().checkUserName().checkUserPwd();
 在實(shí)際開發(fā)中,我們經(jīng)常需要擴(kuò)展一些功能和模塊。擴(kuò)展可以在本對(duì)象或者父類對(duì)象或者原型上

 1         Function.prototype.checkUserName = function(){
 2             console.log("ghostwu");
 3         };
 4 
 5         var fn1 = function(){};
 6         var fn2 = function(){};
 7 
 8         console.log( "checkUserName" in fn1 ); //true
 9         console.log( "checkUserName" in fn2 ); //true
10 
11         fn1.checkUserName(); //ghostwu
12         fn2.checkUserName(); //ghostwu
如果我們使用上面這種方式擴(kuò)展,從功能上來(lái)說(shuō),是沒(méi)有問(wèn)題的,但是確造成了全局污染:通俗點(diǎn)說(shuō),并不是說(shuō)有的函數(shù)都需要checkUserName這個(gè)方法,而我們這樣寫,所有的函數(shù)在創(chuàng)建過(guò)程中都會(huì)從父類的原型鏈上繼承checkUserName, 但是這個(gè)方法,我們根本不用, 所以浪費(fèi)性能, 為了解決這個(gè)問(wèn)題,我們應(yīng)該要在需要使用這個(gè)方法的函數(shù)上添加,不是所有的都添加,另外關(guān)于in的用法,如果不熟悉,可以看下我的這篇文章:立即表達(dá)式的多種寫法與注意點(diǎn)以及in操作符的作用

 1         Function.prototype.addMethod = function( name, fn ){
 2             this[name] = fn;
 3         }
 4 
 5         var fn1 = function(){};
 6         var fn2 = function(){};
 7 
 8         fn1.addMethod( "checkUserName", function(){console.log("ghostwu");});
 9 
10         fn1.checkUserName(); //ghostwu
11         fn2.checkUserName(); //報(bào)錯(cuò)

通過(guò)上述的改造,成功解決了全局污染, fn2這個(gè)函數(shù)上面沒(méi)有添加checkUserName這個(gè)方法,只在fn1上面添加

我們繼續(xù)把上面的方式,改成鏈?zhǔn)秸{(diào)用: 這里需要改兩個(gè)地方, 一種是添加方法addMethod可以鏈?zhǔn)教砑樱?一種是添加完了之后,可以鏈?zhǔn)秸{(diào)用

1         Function.prototype.addMethod = function( name, fn ){
 2             this[name] = fn;
 3             return this;
 4         };
 5 
 6         var fn1 = function(){};
 7 
 8         fn1.addMethod( "checkUserName", function(){
 9             console.log( "userName:ghostwu" );
10             return this;
11         } ).addMethod( "checkUserEmail", function(){
12             console.log( "userEmail" );
13             return this;
14         } ).addMethod( "checkUserPwd", function(){
15             console.log( "userUserPwd" );
16             return this;
17         } );
18         fn1.checkUserName().checkUserEmail().checkUserPwd();
上面是屬于函數(shù)式 鏈?zhǔn)?調(diào)用,  我們可以改造addMethod方法, 在原型上添加函數(shù),而不是實(shí)例上, 這樣我們就可以達(dá)到類式的鏈?zhǔn)秸{(diào)用

 1         Function.prototype.addMethod = function( name, fn ){
 2             this.prototype[name] = fn;
 3             return this;
 4         };
 5 
 6         var fn1 = function(){};
 7 
 8         fn1.addMethod( "checkUserName", function(){
 9             console.log( "userName:ghostwu" );
10             return this;
11         } ).addMethod( "checkUserEmail", function(){
12             console.log( "userEmail" );
13             return this;
14         } ).addMethod( "checkUserPwd", function(){
15             console.log( "userUserPwd" );
16             return this;
17         } );
18         new fn1().checkUserName().checkUserEmail().checkUserPwd();
 

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87356.html

相關(guān)文章

  • 淺談JavaScript面向對(duì)象

    摘要:不必在構(gòu)造函數(shù)中定義對(duì)象實(shí)例的信息。其次,按照一切事物皆對(duì)象的這餓極本的面向?qū)ο蟮姆▌t來(lái)說(shuō),類本身并不是一個(gè)對(duì)象,然而原型方式的構(gòu)造函數(shù)和原型本身也是個(gè)對(duì)象。第二個(gè)問(wèn)題就是在創(chuàng)建子類型的實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。 前言 對(duì)象(Object)應(yīng)該算是js中最為重要的部分,也是js中非常難懂晦澀的一部分。更是面試以及框架設(shè)計(jì)中各出沒(méi)。寫這篇文章,主要參考與JavaScrip...

    cyixlq 評(píng)論0 收藏0
  • 復(fù)習(xí)Javascript專題(三):面向對(duì)象對(duì)象創(chuàng)建繼承,原型及原型鏈)

    摘要:在創(chuàng)建子類實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。構(gòu)造函數(shù)繼承子類傳進(jìn)的值是基本思想是在子類構(gòu)造函數(shù)的內(nèi)部調(diào)用超類或父類型構(gòu)造函數(shù)。繼承保證構(gòu)造函數(shù)指針指向如果想同時(shí)繼承多個(gè),還可使用添加屬性的方式類繼承, OOP:Object Oriented Programming 面向?qū)ο缶幊獭?題外話:面向?qū)ο蟮姆秶鷮?shí)在太大,先把這些大的東西理解理解。 1.什么是對(duì)象? 根據(jù)高程和權(quán)威指南上...

    testHs 評(píng)論0 收藏0
  • 一名【合格】前端工程師自檢清單

    摘要:在他的重學(xué)前端課程中提到到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系中的重要崗位之一。大部分前端工程師的知識(shí),其實(shí)都是來(lái)自于實(shí)踐和工作中零散的學(xué)習(xí)。一基礎(chǔ)前端工程師吃飯的家伙,深度廣度一樣都不能差。 開篇 前端開發(fā)是一個(gè)非常特殊的行業(yè),它的歷史實(shí)際上不是很長(zhǎng),但是知識(shí)之繁雜,技術(shù)迭代速度之快是其他技術(shù)所不能比擬的。 winter在他的《重學(xué)前端》課程中提到: 到現(xiàn)在為止,前端工程師已經(jīng)成為研...

    羅志環(huán) 評(píng)論0 收藏0
  • 一名【合格】前端工程師自檢清單

    摘要:在他的重學(xué)前端課程中提到到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系中的重要崗位之一。大部分前端工程師的知識(shí),其實(shí)都是來(lái)自于實(shí)踐和工作中零散的學(xué)習(xí)。一基礎(chǔ)前端工程師吃飯的家伙,深度廣度一樣都不能差。開篇 前端開發(fā)是一個(gè)非常特殊的行業(yè),它的歷史實(shí)際上不是很長(zhǎng),但是知識(shí)之繁雜,技術(shù)迭代速度之快是其他技術(shù)所不能比擬的。 winter在他的《重學(xué)前端》課程中提到: 到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系...

    isaced 評(píng)論0 收藏0
  • 【譯】每個(gè)JavaScript 開發(fā)者應(yīng)該了解10個(gè)面試題

    摘要:避免脆弱的基類問(wèn)題。紅牌警告沒(méi)有提到上述任何問(wèn)題。單向數(shù)據(jù)流意味著模型是單一的事實(shí)來(lái)源。單向數(shù)據(jù)流是確定性的,而雙向綁定可能導(dǎo)致更難以遵循和理解的副作用。原文地址 1. 你能說(shuō)出兩種對(duì) JavaScript 應(yīng)用開發(fā)者而言的編程范式嗎? 希望聽到: 2. 什么是函數(shù)編程? 希望聽到: 3. 類繼承和原型繼承的不同? 希望聽到 4. 函數(shù)式編程和面向?qū)ο缶幊痰膬?yōu)缺點(diǎn)? ...

    mykurisu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<