这是javascript原型的错误使用吗?
我有一个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
// 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哦,好的,我将修改答案;)请注意,您可能还需要设置
原型
构造函数。请注意,您可能还需要设置原型
构造函数。