簡體   English   中英

將ES6類存儲在變量中,並通過Object.Create對其進行實例化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM