gpt4 book ai didi

javascript - 将参数传递给 Javascript IIFE 构造函数

转载 作者:行者123 更新时间:2023-11-27 23:30:45 25 4
gpt4 key购买 nike

我正在尝试了解 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;
}
};

对于 child 来说:

var init = function(arg) {
Base.call(this, arg);
};

这使得 arg 对外界可用,因此为了使其只读,我想 getter 可以工作:

var init = function(arg) {
var theArg = arg;
this.getArg = function() { return theArg };
};

从表面上看,我看不出这有什么问题,而且我也想不出更好的选择。有吗?我是否遗漏了一些明显的东西?

最佳答案

I can't think of a better alternative. Is there one?

没有。不在你的例子中。

I like the fact that in the 'pure' IIFE module I can simply refer to the constructor parameter in any functions defined within it, so that they become closures.

您可以在每个函数中访问args,因为在第一个示例中,您在每个对象实例上分别定义foo。因此,foo 的每个定义都有一个单独的闭包,其中包含定义它时传递的args

这也是唯一可能的,因为 foo 是在包含 args 的范围内定义的。

But how do I access constructor params when I'm adding these subsequent functions ... in the inheritance example above?

通过使用您发现的经典继承模式,您现在可以在构造函数原型(prototype)上定义 foo 函数。这意味着仅存在一个 foo 定义,该定义由使用构造函数创建的所有实例继承。因此 foo 不能再针对每个实例进行指定。

正如您所想,这也意味着 foo 不再在包含 args 的范围内定义,并且无法直接访问。

因此,将 args 分配给 this.thisArgs 是正确的,这允许 foo 在每个上访问 thisArgs实例。您已将 foo 设为通用案例函数,可以处理它所应用到的任何实例。

将参数传递给 IIFE 构造函数: IIFE 本身不是构造函数,它只是构建构造函数对象。当调用构造函数本身时,IIFE 的作用域早已返回。

Am I missing something obvious?

是的。 JavaScript 是一种原型(prototype)语言。它从来就不是要像“古典”语言一样。就让它成为 JavaScript 吧。 :)

关于javascript - 将参数传递给 Javascript IIFE 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34601857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com