gpt4 book ai didi

javascript - 与闭包共享构造函数参数

转载 作者:行者123 更新时间:2023-11-28 00:26:04 25 4
gpt4 key购买 nike

我试图理解为什么其中一个版本有效而​​另一个版本无效。为什么进行 getConfigFails 赋值是非法的?

var MyClass = (function(){
var _config;
function MyClass(config){
_config = config;
}
MyClass.prototype.getConfigWorks = function(){
_config.getConfigWorks();
}
//Uncaught TypeError: Cannot read property 'getConfigFails' of undefined
MyClass.prototype.getConfigFails = _config.getConfigFails;
return MyClass;
})();
var myClass = new MyClass({
getConfigWorks:function(){
console.log('no errors here');
},
getConfigFails: function(){ console.log('fail')}
});

console.log(myClass);

最佳答案

您首先应该注意,您的构造函数不是 (function(){})() 函数,而是 function MyClass(){} 函数。外部自调用函数只是为了创建一个闭包以使 _config 私有(private)。

知道这一点。显然,如果我们不关心 _config 是否是私有(private)的,代码也应该可以工作,不是吗?也就是说,如果_config是全局变量,逻辑是相同的。

所以,如果我们可以允许 _config 是全局的,那么您的代码与此完全相同:

var _config;
function InnerClass(config){
_config = config;
}
InnerClass.prototype.getConfigWorks = function(){
_config.getConfigWorks();
}
//Uncaught TypeError: Cannot read property 'getConfigFails' of undefined
InnerClass.prototype.getConfigFails = _config.getConfigFails;

var MyClass = InnerClass;

var myClass = new MyClass({
getConfigWorks:function(){
console.log('no errors here');
},
getConfigFails: function(){ console.log('fail')}
});

console.log(myClass);

这样写。很明显为什么 _config.getConfigFails 未定义。这是因为你没有给它分配任何东西。

重要的是要记住,调用 new MyClass() 只是调用构造函数,而不是它周围的任何代码。因此,如果您将上述代码重新包装在 IIFE 中,逻辑不会改变,只会调用构造函数,而不是 IIFE。

关于javascript - 与闭包共享构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29482812/

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