有没有更好的方法从构造函数返回对象和构造函数?

时间:2019-02-19 16:52:29

标签: javascript object constructor return return-value

我试图返回一个对象以及构造函数。我有一些工作要做,但是有点丑陋,希望有更好的方法。

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 :(得分:1)

您似乎在寻找类似的东西

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运算符仍然是可选的,因此您无需显式检查它