gpt4 book ai didi

javascript - 在 Javascript 中使用闭包对对象调用 new

转载 作者:行者123 更新时间:2023-12-03 11:31:40 25 4
gpt4 key购买 nike

当在使用闭包的对象上调用 new 时,据我了解,闭包是在实例化时设置的,其中私有(private)变量将是“类”的静态属性。

例如:

var testClass=(function(){
var self={...properties...};
return function(){
return {
someFunc: (function(){
var self={...other properties...}
return {
self: self
};
}())
};
};
}());

var newObject=new testClass();

因此,如果我需要将 someFunc 实例存储为 testClass 的属性,我可以使用上述语法吗?每次创建新的 testClass 实例时,someFunc 中的“var self”是否会被实例化,或者闭包是否是一次性处理,其中所有实例中的实例A.someFunc.self == instanceB.someFunc.self if instanceA = new testClass();和instanceB = new testClass();

希望这是有道理的。我还没有测试过

最佳答案

该代码甚至无法正常工作。将会发生以下情况:

外部 IIFE 将在代码初始化时运行。这将建立:

var self = {...};

一旦变量testClass将包含您的内部对象。

然后,你会做:

var newObject=new testClass();

并收到错误,因为 testClass 是一个对象,而不是构造函数。确切的错误在这个 jsFiddle是:未捕获类型错误:对象不是函数

<小时/>

编辑:现在您已经更改了代码。

最顶层的 var self= {...} 仅在外部 IIFE 运行时实例化一次。它对于 testClass() 的所有实例都是通用的。这是因为外部 IIFE 仅运行一次,并且在其中创建的变量成为闭包的一部分,然后内部函数的所有实例(将成为您的实际构造函数)共享该闭包。

内部 self (someFunc() 中的那个)将在每次调用 obj.someFunc() 时单独创建,并且在someFunc() 本地声明的函数将覆盖更高级别的 self,并且您将无法从 someFunc 内部访问更高级别的函数。

我通常认为在本地作用域中使用已在更高级别父作用域中定义的相同变量名是一种不好的做法,因为它没有为您提供任何有用的功能,并且只是一个完全混淆或欺骗的机会。真的在发生。选择一个独特的名称。

关于javascript - 在 Javascript 中使用闭包对对象调用 new,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26707093/

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