[英]Store ES6 class in variable and instance it through Object.Create
我當前需要通過變量將類傳遞給函數,該函數動態調用其構造函數,依此類推。 簡短示例:
class MyClass {
constructor ($q) {
console.log($q);
}
expose () {
return {};
}
}
const myclass = function () {
// My concern is this ------.
// I need to pass it |
// as a variable \|/
// '
let obj = Object.create(MyClass.prototype);
obj.constructor.apply(obj, arguments);
return {}; // other stuff goes here
};
myclass.$inject = ['$q'];
export {myclass};
我的想法是將MyClass作為變量傳遞,以這種方式進行:
const myclass = function (classVariable) {
let obj = Object.create(classVariable.prototype);
obj.constructor.apply(obj, arguments);
return {}; // other stuff goes here
};
這樣我就可以像let newclass = myclass(MyClass);
這樣來稱呼它let newclass = myclass(MyClass);
。 這樣,如果我有不同的類(MyClass2,MyClass3等),則不必在每個文件中重復代碼。 但是,如果我嘗試這樣做,Chrome會拋出一個錯誤,提示它不能將類用作變量或類似的東西。
那么,什么是避免重復代碼的最佳方法呢? 實際上,這是我正在進行的重新設計,以避免需要修復的其他人造成的復制粘貼災難。 提前致謝!
我認為您的困惑是,您認為類構造函數不能被變量引用。 他們可以,只是功能而已。 所以:
class Foo { message() { console.log("I'm a Foo"); } } class Bar { message() { console.log("I'm a Bar"); } } function test(C) { let obj = new C(); obj.message(); // "I'm a Foo" or "I'm a Bar", depending on // whether Foo or Bar was passed in } test(Foo); test(Bar);
您的調用var obj = Object.create(X.prototype)
后跟X.apply(obj, /*...args here...*/)
在ES5和更早版本中可以使用,但是ES2015的類不允許它。 要從它們構造實例, 必須使用new
運算符。 這樣做的原因與子類化和設置new.target
,因此,如果實例有創建新實例的理由(如Promise
所做的那樣),則它可以明確地做到這一點。
似乎可以退后一步,但是如果由於某種原因您將構造函數參數作為數組而不是離散項,則可以使用擴展符號使用new
:
let obj = new C(...args);
因此, 如果您需要一個接受類構造函數和參數數組的泛型函數,並且需要使用這些參數返回該類的實例,則它看起來像這樣:
function createInstanceOf(C, args) {
return new C(...args);
}
我相信您正在尋找的是封閉 :
function makeFactory(constructor) {
return function(...args) {
let obj = new constructor(...args);
return {}; // other stuff goes here
};
}
const myclass = makeFactory(MyClass);
// then use
myClass().expose() // or whatever you were going to do with it
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.