我试图返回一个对象以及构造函数。我有一些工作要做,但是有点丑陋,希望有更好的方法。
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
答案 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
运算符仍然是可选的,因此您无需显式检查它