我有一个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在第二个例子的引擎盖下做了什么。
答案 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());
你必须记住保持范围到“这”是什么。