2013-08-19 33 views
1

我爲創建菜單一個JavaScript模塊對象最初設計是這樣的:javascript原型的這個不好用嗎?

// original Menu module 
function Menu () { 
    alert ("Menu ()"); 
} 

Menu.prototype.init = function () { 
    alert ("Menu.init ()"); 
} 

var menu = new Menu; 

我現在想換我的API裏面,像這樣

// new API containing Menu 
(function ($api, window, undefined) {   

    $api.Menu = function () { 
     alert ("$api.Menu ()"); 
    }; 

    $api.Menu.prototype.init = function () { 
     alert ("$api.Menu.init ()"); 
    }; 

}(window.$api = window.$api || {}, window)); 

var menu = new $api.Menu; 

這似乎是工作,但我的問題是,是否這是對的?例如,這最終會爲每個$ api.Menu實例重複每個原型函數?

我問,因爲我總是使用第一種方法的原型,而我只是不確定Javascript在第二個例子中的底層操作。

+0

在第二個例子中,你只是在一個只調用一次的函數內執行類似的代碼 - 所以任何一種方式都可以正常工作。第二種方式明顯地把對象放在你的命名空間中,但除此之外,它們都工作正常。 – jfriend00

+0

非常好。感謝您的快速響應。 – user2337247

回答

1

在效率方面兩者沒有任何區別,唯一的區別是您在第二個示例中命名空間構造函數,這比污染全局命名空間更好。

但是以下將是低效的,因爲我們將創建一個新init功能每次構造函數獲取調用,我們不會使用原型鏈的所有實例間共享的功能,從而導致更高的內存使用情況。

function Menu() { 
    this.init = function() {}; 
} 
+0

我在代碼中實際上沒有init方法,只是爲了說明原型的使用。 – user2337247

+0

@ user2337247噢好吧,我會修改答案然後;) – plalx

0

他們都會工作,javascript是靈活的。
我傾向於選擇對象/類設置,如:

function Menu(e){ 
    this.init(e); 
} 
Menu.prototype = { 
    a:null, 
    b:null, 
    init:function(config){ 
     this.a = config.a; 
    }, 
    doSomething:function(){ 
     this.b = 'World'; 
    }, 
    getSomething:function(){ 
     return this.a + ' ' + this.b; 
    } 
} 

var menu = new Menu({a:'Hello'}); 
menu.doSomething(); 
alert(menu.getSomething()); 

你只需要記住至於什麼「本」是維護範圍。

+0

請注意,你可能想要設置'prototype'構造函數,但是。 http://stackoverflow.com/questions/8453887/why-is-it-necessary-to-set-the-prototype-constructor – plalx