这是javascript原型的错误使用吗?

这是javascript原型的错误使用吗?,javascript,prototype,Javascript,Prototype,我有一个javascript模块,用于创建菜单对象,最初设计如下: // original Menu module function Menu ( ) { alert ( "Menu ( )"); } Menu.prototype.init = function ( ) { alert ( "Menu.init ( )"); } var menu = new Menu; 我现在希望像这样将其封装在我的API中 // new API containing Menu ( fun

我有一个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实例复制每个原型函数


我问这个问题是因为我总是在第一个方法中使用prototype,而我只是不确定Javascript在第二个示例中做了什么。

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

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

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

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

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

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

它们都能工作,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());

您只需记住,要尽可能地维护“this”的作用域。

它们都可以工作,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());

您只需记住维护作用域,直到“this”是什么。

在第二个示例中,您只是在一个只调用一次的函数中执行类似的代码,因此任何一种方法都可以正常工作。第二种方法显然是将对象放在名称空间中,但除此之外,它们都工作得很好。感谢您的快速响应。在第二个示例中,您只是在一个只调用一次的函数中执行类似的代码,因此任何一种方法都可以正常工作。第二种方法显然是将对象放在名称空间中,但除此之外,它们都工作得很好。感谢您的快速响应。我的代码中实际上没有init方法,它只是为了演示原型的使用。@user2337247哦,好的,我将修改答案;)实际上,我在代码中没有init方法,只是为了说明原型的使用。@user2337247哦,好的,我将修改答案;)请注意,您可能还需要设置
原型
构造函数。请注意,您可能还需要设置
原型
构造函数。