Есть ли лучший способ вернуть объект и конструктор из функции конструктора? - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь вернуть объект вместе с функцией конструктора.У меня что-то работает, но это уродливо, и я надеялся, что есть лучший способ.

function Something(val) {
  if (!(this instanceof Something))
    return new Something(val)

  let Constructor = function() {
    return function(val) {
      return new Something(val)
    }
  }

  let obj = new Constructor()
  obj.test = val
  return obj
}

let a = Something('a')
let b = new Something('b')
let c = b('c')

console.log(a) // { [Function] test: 'a' }
console.log(b) // { [Function] test: 'b' }
console.log(c) // { [Function] test: 'c' }

Спасибо за любую помощь.


Редактировать:

При дальнейшем рассмотрении я считаю, что необходимы дополнительные объяснения, а также решил подойти к проблеме под другим углом.

Хорошо, давайте посмотрим, смогу ли я гипотетически сформулировать свою проблему.У меня есть Фабрика, которая должна преобразовываться в другой «класс» (хотя и с использованием прототипов функций ES5).Этот другой «класс» должен иметь возможность иметь необязательную функцию конструктора класса вместе с тем, что мы называем «методами класса».Этот пользовательский класс также должен быть экземпляром, чтобы он мог хранить данные из своих методов (см. this)

В идеале нам нужны следующие синтаксисы.

const something = Something('customClass') // new keyword is optional
something.someMethod()
// or
something(optionalConfig).someMethod()

ВВ дополнение к вызову класса с необязательным конструктором, мы также должны создать новый экземпляр.

Чтобы эти строки действовали в отдельных экземплярах:

something.someMethod() // refers to the instance already created
something(optionalConfig).someMethod() // new instance
something(otherOptionalConfig).someMethod() // new instance

1 Ответ

0 голосов
/ 20 февраля 2019

Вы, похоже, ищете что-то вроде

function Custom(config) {
  function customInstance(moreConfig) {
    return new Custom(config + moreConfig); // not calling Something!
  }
  Object.setPrototypeOf(customInstance, Custom.prototype);
  customInstance.config = config;
  customInstance.test = true
  return customInstance;
}
Custom.prototype = Object.create(Function.prototype);
Custom.prototype.method = function() { … };

const constructors = {Custom, …};
function Something(className) {
  if (!constructors.hasOwnProperty(className)) throw new Error("…");
  return new constructors[className];
}

Учитывая, что конструктор Custom, а также фабрика Something в любом случае возвращают объект (функцию), оператор newв любом случае не является обязательным, и вам не нужно явно проверять это.

...