当两个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
Extended
TEST.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对象测试访问它。

测试未定义
应该是您需要的所有信息。一旦您解决了这个问题,您的第二个选项应该可以正常工作。闭包在这里也不相关,因为您没有在其中隐藏任何内容。我如何在那里定义
测试
“仍在定义中”当我定义
扩展时
?我确实意识到在这个简单的例子中,闭包术语是不相关的,我有一个更大的例子,其中内容确实是隐藏的,并且认为它们可能是相互关联的。请参阅下面我的答案。