2016-04-05 118 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);