<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    如何在15分鐘內掌握JavaScript面向對象編程

      導讀:經??吹揭恍㎎avaScript的代碼臟亂得無法理解,到處都是屬性和方法,或者一個循環套著一個循環。但如果使用面向對象就能很好的理清代碼,并方便理解和修改代碼。如果你不希望自己的代碼只有上帝理解的話,就請盡量考慮使用面向對象的模式。

      譯文正文:

      到處都是屬性、方法,代碼極其難懂,天哪,我的程序員,你究竟在做什么?仔細看看這篇指南,讓我們一起寫出優雅的面向對象的JavaScript代碼吧!

      作為一個開發者,能否寫出優雅的代碼對于你的職業生涯至關重要。隨著像Node.js這類技術的發展,你甚至可以在服務器端使用JavaScript了。同樣的,你也可以使用JavaScript來控制MongoDB的持續數據存儲。

      文本標記

      文本標記只是JavaScript里創建對象的一種方法,當然這里肯定不止這一種,但它是你在只打算創建一個對象實例時的首選方法。

    var bill = {};

      上面的代碼并不實用,它只是一個空對象。接下來我們動態地向這個對象中添加一些屬性和方法。

    1. bill.name = "Bill E Goat";  
    2. bill.sound = function() {  
    3.     console.log( 'bahhh!' );  
    4. };

      這里添加了屬性name,并且給它分配了值"Bill E Goat"。我們并不需要先創建一個空對象,而可以把所有代碼直接寫在一對括號里。

    1. var bill = { 
    2.   name: "Bill E Goat"
    3.   sound: function() { 
    4.     console.log( 'bahhh!' ); 
    5.   }
    6. };

      是不是很美觀?訪問它的屬性和方法就像呼吸一樣簡單、自然。

    1. bill.name; // "Bill E Goat" 
    2. bill.sound(); // "bahhh"

      如果屬性名不是一個合法的標志符,我們還可以這樣訪問它:

    bill['name']; // "Bill E Goat"

      注意:我在調用方法時在其后添加了圓括號。現在,我們再重寫一下當前的sound方法,并添加一個參數。

    1. bill.sound = function(noise) {  
    2.     console.log(noise);  
    3. };  
    4. bill.sound("brrr!"); // "brrr!" He's cold :)

      很好,我們已經傳入參數了,并且在方法定義中訪問了它。接下來,向對象中增加一個新方法來訪問name屬性。

    1. bill.sayName = function() { 
    2.     console.log( "Hello " + this.name ); 
    3. }; 
    4. bill.sayName(); // "Hello Bill E Goat"

      我們可以使用this.propertyName(在本例中即this.name)在方法內訪問屬性。

    bill.sayName; // function

      怎么回事?訪問sayName方法返回了一個方法定義?,F在讓我們再深入些。

    1. var sound = bill.sound; 
    2. sound('moo!'); // "moo!"

      現在我們指定了sound方法為一個局部函數,可以調用這個函數并且傳遞參數。你認為在復制bill的時候會發生什么?(類比下克隆羊Dolly)

    1. var sally = bill; 
    2. sally.name; // "Bill E Goat",可它的名字是Sally
    3. sally.name = "Sally"
    4. sally.name; // "Sally",好些了
    5. bill.name; // "Sally",問題又轉移到bill身上了

      上面的例子中我們新建了一個變量sally,并使它和bill相同,所以bill和sally會在內存中引用了同一個對象。這時候給改變一塊它們就會同時發生改變。再看看下面這段代碼:

    1. bill.name = "Bill E Goat"
    2. bill.sayName(); // "Hello Bill E Goat"; 
    3. var sayName = bill.sayName; 
    4. sayName; // function 目前為止一切順利
    5. sayName(); // "Hello ",為什么這里又不再顯示bill的名字了?

     bill的name是一個本地實例變量,只對bill可得。當sayName方法被創建為全局變量時,當它碰到this.name聲明時,它會在全局查找name的值。唯一的問題在于name還沒有被定義?,F在讓我們在全局定義name,看看會發生什么:

    1. var name = "Bearded Octo"
    2. sayName(); // "Hello Bearded Octo"

      這里我們在全局范圍內定義了name變量,并且賦予了值"Bearded Octo"。當我們在調用sayHello方法時它會在全局范圍內查找name變量,最終會獲得值"Bearded Octo"。我們為什么不為這幾個對象建立一個共同的“類”呢?

      構造函數

      構造函數是另一個編寫面向對象JavaScript代碼的方法,當你需要初始化對象的屬性、方法,或者需要創建多個屬性、方法各不相同的實例時,它將是你最佳的選擇。同樣我們先從創建一個空對象開始:

    function Game() {};

      這個對象包括自己的屬性,你甚至可以在創建對象時傳入屬性,然后再對其進行修改。

    1. var zelda = new Game(); 
    2. var smb = new Game(); 
    3. zelda.title = "Legend of Zelda"
    4. smb.title = "Super Mario Brothers"
    5. zelda.title; // "Legend of Zelda" 
    6. smb.title; // "Super Mario Brothers"

      現在這個對象已經有自己的方法了!新創建對象時我們甚至可以傳遞屬性,之后再修改。

    1. function Game(title) {  
    2.     this.title = typeof title !== 'undefined' ? title : "";  
    3. };  
    4. var zelda = new Game("Legend of Zelda");  
    5. zelda.title; // "Legend of Zelda" 
    6. zelda.title = "Ocarina of Time"
    7. zelda.title; // "Ocarina of Time" 
    8. var blank = new Game(); 
    9. blank.title; // ""

      也許你沒看明白第二行的內容,其實是使用了三元操作來避免單行的if else,它和下面標準的if else語句是一個意思。

    1. if (typeof title !== 'undefined') {  
    2.     this.title = title;  
    3. else {  
    4.     this.title = "";  
    5. }  
    6. // Is the same as  
    7. this.title = typeof title !== 'undefined' ? title : "";

      如果title變量在對象被創建時傳入,title實例變量將會指定為title的值。如果沒有值傳入,那么title將會被初始化為默認值""。我們同樣可以創建一個方法來訪問這個屬性:

    1. zelda.loveTitle = function() { 
    2.     console.log( "I love " + this.title );  
    3. }; 
    4. zelda.loveTitle(); // "I love Ocarina of Time"

      這樣就很整潔了,但是我們還能做得更好。我們可以在Game類中添加一個方法,這樣所有Game類的實例將都能使用此方法。

    1. Game.prototype.heartIt = function() {  
    2.     console.log( "I heart " + this.title );  
    3. };  
    4. zelda.heartIt(); // "I heart Ocarina of Time"  
    5. smb.heartIt(); // "I heart Super Mario Brothers"

      后記:當然這只是JavaScript面向對象編程的入門,OO JS還有很多內容可以講。

    posted on 2012-05-09 10:02 順其自然EVO 閱讀(789) 評論(2)  編輯  收藏 所屬分類: HTML5

    評論

    # re: 如何在15分鐘內掌握JavaScript面向對象編程 2014-04-06 19:19 sifi

    在這里的http://www.miniqiang.com  回復  更多評論   

    # re: 如何在15分鐘內掌握JavaScript面向對象編程[未登錄] 2014-04-26 14:47 zhang

    用alert(bill.sound());問什么沒有反應?IE瀏覽器~  回復  更多評論   

    <2012年5月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 永久免费av无码网站韩国毛片| 一级毛片在线免费看| 亚洲午夜福利精品久久| 国产高清对白在线观看免费91 | 日韩av无码成人无码免费| 亚洲精品蜜夜内射| 国产亚洲精久久久久久无码77777| 亚洲午夜免费视频| 亚洲av无码专区首页| 亚洲av无码不卡| 国产无遮挡色视频免费视频| 最近免费mv在线观看动漫 | 国产成人1024精品免费| 亚洲欧洲日产国码www| jjzz亚洲亚洲女人| 波多野结衣在线免费视频| 爱情岛论坛免费视频| 亚洲精品在线播放| 国产精品亚洲mnbav网站 | 在线中文高清资源免费观看| jizz免费一区二区三区| 亚洲综合偷自成人网第页色| 亚洲熟妇无码另类久久久| 日韩a级毛片免费观看| 国产精品免费精品自在线观看| 一级特级aaaa毛片免费观看 | 豆国产96在线|亚洲| 亚洲国产一区国产亚洲| 亚洲高清免费视频| 成人毛片18女人毛片免费96| 免费人成毛片动漫在线播放| 免费人成再在线观看网站| 亚洲一区二区三区不卡在线播放| 国产亚洲精品资源在线26u| 又粗又硬免费毛片| 免费高清在线爱做视频| 曰曰鲁夜夜免费播放视频 | 日韩亚洲国产综合高清| 久久亚洲中文字幕精品有坂深雪| 亚洲人成电影网站国产精品| 国产精品视_精品国产免费|