2016-04-05 58 views
-1

我只是无法找到声明ES6类的引用存储在哪里,我希望他们在窗口对象,他们不会出现在那里。ES6类商店

我不认为它是ES6 classes : what about instrospection?的重复,因为他要求存在一个类的存在检查,我想要的是一个可用类的列表。

例如:

class Test { 
    constructor() { 

    } 
} 

window.Test // undefined 

我想的是,扩展类矿井的所有类的列表

澄清,我有一个看起来像这样的结构:

class Base { 
    constructor(components) { 
     for(let component of components) { 
      window[component](); // window.Test2 not defined 
     } 
    } 

    start() { 
     new this(); 
    } 
} 

class Test2 extends Base { 
    constructor() { 
     super(); 
    } 
} 

class Test extends Base { 
    constructor() { 
     super(['Test2','Test2']); 
    } 
} 

Test.start(); 

这只是我的结构的抽象,总之我不得不使用字符串super(['Test2', 'Test2'])

目前我在做这样的事情

Base.register(Test2); 

每一个类,我想摆脱这一点。

+0

你不能只是“获取所有类的列表”。你将不得不做一些可怕的事情,比如创建一个全局对象来存储所有这些对象。 – ndugger

+0

你可以尝试从一个已知的类(比如String)开始,然后升级原型链直到找到其他类。他们不一定都在同一个地方,或者都是从同一个东西继承而来。 –

+3

*“我真正想要的是扩展我的一个类的所有类的列表”*这是不可能的。 –

回答

0

您可以使用Class expressions将它们存储在某种数组中,但如果我是你,我可能不会这样做。

var Test = class Test { 
    constructor() { 

    } 
} 

allClasses.push(Test); 
+0

如果这是你不愿意做的事情,那不太值得回答。 – ndugger

0

JavaScript类在ECMAScript中6引入超过JavaScript的现有的基于原型的继承语法糖。类语法没有为JavaScript引入新的面向对象的继承模型。 JavaScript类提供了更简单,更清晰的语法来创建对象并处理继承。

基本上ES6类被编译为普通的老式Javascript函数。你可以将它们“存储”在窗口对象上,但这是一个重大陷阱,因为你正在杀死整个模块模式ES6。

0

如果你想排序一类的 “模块”,理论上你就可以做这样的事情:

// some-class.js 

export default class SomeClass {} 

然后:

// another-class.js 

export default class AnotherClass {} 

而且你的入口文件:

// index.js 

import SomeClass from './some-class.js' // extensions optional; here just for clarity 
import AnotherClass from './another-class.js' 

export default { 
    SomeClass, 
    AnotherClass 
} 

如果您将所有这些嵌入到相同的目录中(我们将调用目录example),那么您可以将impor t整个模块,无论你需要它:

// something-that-requires-your-module.js 

// this will by default enter through the `index.js` file of your `example` directory 
import Example from './example'; 

console.log(Example.SomeClass); 
console.log(Example.AnotherClass);