我试图了解Javascript OO,使用IIFE模块模式来模仿一个类:
var MyClass = (function() {
// Constructor
return function() {
return {
foo: 'foo'
}
}
}());
我通过以下方式传递参数:
var MyClass = (function() {
// Constructor
return function(arg) {
return {
foo: function() {
return 'foo'+arg
}
}
}
}());
为了模仿经典继承,我使用了建议的模式here:
function inherit(base, child, obj) {
child.prototype = Object.create(base.prototype);
child.prototype.constructor = child;
obj&&Object.keys(obj).forEach(function(key){
child.prototype[key] = obj[key];
})
}
var Base = (function() {
var init = function() {};
init.prototype = {
foo: function() {
return "foo";
}
};
return init;
}());
var Child = (function() {
var init = function() {
Base.call(this);
};
inherit(Base, init, {
bar: function() {
return 'bar';
}
});
return init;
}());
到目前为止一切顺利。我唯一的问题是在我以上述方式进行继承时,理解如何将参数传递给我的类构造函数。我喜欢这样一个事实:在纯粹的' IIFE模块我可以简单地在其中定义的任何函数中引用构造函数参数,以便它们成为闭包。但是,如果我使用构造函数变量添加这些后续函数,如何在上面的继承示例中访问构造函数参数?我想我可以做类似的事情:
var init = function(arg) {
this.theArg = arg;
};
然后我可以在随后的任何内容中访问它:
init.prototype = {
foo: function() {
return "foo"+this.theArg;
}
};
对于孩子:
var init = function(arg) {
Base.call(this, arg);
};
这使得arg
可供外界使用,所以为了让它只读,我想一个getter可以工作:
var init = function(arg) {
var theArg = arg;
this.getArg = function() { return theArg };
};
从表面上看,我看不出有什么不妥,我无法想到更好的选择。有吗?我错过了一些明显的东西吗?
答案 0 :(得分:1)
我想不出更好的选择。有吗?
没有。不在你的例子中。
我喜欢在'纯'IIFE模块中我可以简单地在其中定义的任何函数中引用构造函数参数,以便它们成为闭包。
您可以在每个函数中访问args
,因为在第一个示例中,您将分别在每个对象实例上定义foo
。因此,foo
的每个定义都有一个单独的闭包,其中包含定义时传递的args
。
这也是唯一可行的,因为foo
是在包含args
的范围内定义的。
但是当我在上面的继承示例中添加这些后续函数时,如何访问构造函数参数?
通过使用您找到的经典继承模式,您现在在构造函数原型上定义foo
函数。这意味着只存在一个foo
定义,该定义由使用构造函数创建的所有实例继承。因此,foo
不能再针对每个实例。
如您所知,这也意味着foo
不再在包含args
的范围内定义,并且无法直接访问。
因此,您可以args
分配this.thisArgs
,以便foo
允许thisArgs
访问每个实例上的foo
。您已将chatBox_array.push({key:val_d65f});
作为一般案例函数,可以处理它所应用的任何实例。
将参数传递给IIFE构造函数: IIFE本身不是构造函数,它只是构建构造函数对象。 IIFE的范围早已在构造函数本身被调用时返回。
我错过了一些明显的东西吗?
是。 Javascript是一种原型语言。它从来就不像是“古典”语言。让它成为Javascript。 :)