当两个Javascript类都在闭包的返回语句中时扩展Javascript类
我仍在学习闭包,所以考虑到闭包的性质,这可能是不可能的,所以请容忍我。我有一个全局变量,它是从闭包返回的对象。此对象的某些属性是类当两个Javascript类都在闭包的返回语句中时扩展Javascript类,javascript,function,class,object,closures,Javascript,Function,Class,Object,Closures,我仍在学习闭包,所以考虑到闭包的性质,这可能是不可能的,所以请容忍我。我有一个全局变量,它是从闭包返回的对象。此对象的某些属性是类 var TEST = (function() { return { Base: class { constructor() {} hello() { console.log("Hello"); } }, Extended: class { // what do I
var TEST = (function() {
return {
Base: class {
constructor() {}
hello() { console.log("Hello"); }
},
Extended: class { // what do I do here?
constructor() {}
}
}
})();
我能够声明var b=newtest.Base()
并调用该var上的hello()
函数,正常工作
我想做TEST.Extended
ExtendedTEST.Base
,并且可以访问它自己的hello()
函数,到目前为止还没有任何运气。事情是我试过的:
// 1 - ReferenceError: Base is not defined
Extended: class extends Base {...}
// 2 - TypeError: TEST is undefined
Extended: class extends TEST.Base {...}
// 3 - ReferenceError: NamedClass is not defined
Base: class NamedClass {...},
Extended: class OtherNamedClass extends NamedClass {...}
// 4 - TypeError: TEST is undefined
Base: class NamedClass {...},
Extended: class OtherNamedClass extends TEST.NamedClass {...}
我不确定还有其他选择。这在Javascript中可能吗?这里有多个问题 首先,如果您使用的是类,这意味着您在其中声明它的文件几乎肯定会被视为一个模块,这意味着顶级变量在定义它们的文件之外不会自动可见。您必须
导入
测试或执行类似window.TEST=(function(){…
)的操作。说到函数包装器
虽然IIFE确实创建了一个没有任何意义的闭包,因为你没有结束任何事情:正如你所写的,包装器是没有意义的
var TEST = {
Base: class { /* definition goes here */ }
};
与您编写的相同。为了使闭包具有任何实用程序,您需要在其中隐藏某些内容
var TEST = (function() {
var private = whatever;
return {
Base: class {}
};
})();
return
ed对象在private上关闭
现在谈谈你的实际问题
如何将扩展类导出为测试对象的一部分。简短回答:
你不能这样做。它需要参考TEST.Base
,而你不能在对象定义中这样做。有几种选择,但如果你不想让Base暴露,我会这样做:
var TEST = (function() {
var Base = class { /* class definition goes here */ };
return {
Base,
Extended: class extends Base { /* extension definition goes here */ }
};
})();
请注意,这仍然有些不必要。您可以轻松地编写
var Base = class {};
var TEST = { Base, Extended: class extends Base {} };
事实上,现在我们有了ES 6模块(或者可以可靠地伪造它们),这确实是应该如何编写的(IMHO)。您可以决定是单独导出Base还是仅通过API对象测试访问它。
测试未定义
应该是您需要的所有信息。一旦您解决了这个问题,您的第二个选项应该可以正常工作。闭包在这里也不相关,因为您没有在其中隐藏任何内容。我如何在那里定义测试
“仍在定义中”当我定义扩展时
?我确实意识到在这个简单的例子中,闭包术语是不相关的,我有一个更大的例子,其中内容确实是隐藏的,并且认为它们可能是相互关联的。请参阅下面我的答案。