1

我有一个用于创建 Menu 对象的 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 在第二个示例的底层做了什么。

4

2 回答 2

1

两者在效率方面没有任何区别,唯一的区别是您在第二个示例中为构造函数命名空间,这比污染全局命名空间更好。

但是下面的方法效率很低,因为init每次调用构造函数时我们都会创建一个新函数,而且我们根本不会使用原型链在实例之间共享函数,从而导致更高的内存使用量。

function Menu() {
    this.init = function () {};
}
于 2013-08-19T22:46:15.853 回答
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());

你只需要记住保持范围就“这个”是什么。

于 2013-08-19T23:14:06.860 回答