2015-05-11 61 views
1

我正在嘗試使用Function.prototype方法來探索使用ES6類,而不是當前如何執行它。目前,我們的API看起來像:從函數創建ES6類

var myclass = createClass('MyClass', { 
    test : function() {} 
}); 

我們遍歷對象,並將這些,我們返回特性到功能,基本上不是這樣做的,它的更多的在線與各種其他編程語言更漂亮的方式:

function MyClass() {} 

MyClass.prototype.test = function() {}; 

我們還將該類緩存到一個對象上,其中名稱是鍵,該函數是在整個應用程序中使用的值。類名稱可以是名稱空間,因此您可以擁有My.Cls,它將按期間分割,然後將其緩存到管理器中,但也可以通過window.My.Cls檢索。

縱觀ES6課程,我沒有看到如何保持createClass功能。會喜歡這樣的東西:

function createClass(name, config) { 
    return class name config; 
} 

我沒想到它的工作,它沒有。

兩個問題我在這裏:

  1. 如何創建使用變量作爲類名稱的類?
  2. 如何創建一個類並通過配置對象參數分配屬性?

不確定這是可能的。我們不打算保留createClass,我們希望現在保留並升級我們的傳統「課程」。我想開始使用ES6課程,但不會中斷整個應用程序,無論它需要多長時間才能完成升級。

+0

查看'Reflect'對象。 – Bergi

回答

0

唯一不錯的升級途徑是將屬性哈希值重構爲合適的類。您可以開始這項工作,並在此期間繼續使用基於散列的類,這將減輕一次完成所有操作的要求。

如果你有「類」名稱數量有限:配置雙 - 它應該用於維護的原因 - 那麼你可以用做一個實現替換createClass

class Foo { ... } 
class Bar { ... } 

let classes = {'Foo': Foo, 'Bar': Bar}; 
function createClass(name, config) { 
    if (classes[name]) { 
    return classes[name]; 
    } 
    // old impl 
} 

這將忽略配置是否存在「真實」實現,但如果尚未替換該類,請繼續使用傳統行爲。如果是,你可以實現createClass更像:

function createClass(name, config) { 
    if (classes[name]) { 
    return new classes[name](config); 
    } 
    // old impl 
} 

並通過配置參數到類構造函數。在這種情況下,您可能首先需要過濾掉函數屬性(方法),因爲類可能已經實現了它們。例如:

function createClass(name, config) { 
    if (classes[name]) { 
    let fields = Object.keys(config).filter(key => { 
     return typeof config[key] !== 'function'; 
    }).map(key => config[key]); 

    return new classes[name](fields); 
    } 
    // old impl 
} 
+0

是的,有一種想法是沒有辦法做到這一點。希望沒有我們目前的混合類系統的實現,但並不奇怪我的邊界案例不被支持。 – Ajaxier