这是javascript原型的坏用吗?

时间:2013-08-19 22:29:40

标签: javascript prototype

我有一个javascript模块,用于创建最初设计的Menu对象:

// 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在第二个例子的引擎盖下做了什么。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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());

你必须记住保持范围到“这”是什么。