在JavaScript访谈中询问了以下问题。
创建3个类的实例后,如何防止进一步创建实例?
这是什么答案?
答案 0 :(得分:4)
我假设这个问题要求你得到聪明的"并且不使用任何全局变量或其他类。
您可以使用static
方法跟踪已创建的实例。从那时起,您可以在constructor
中抛出错误以防止实例化。
class Foo {
constructor(name) {
if (Foo.maxInstancesReached())
throw 'Max instances reached'
this.name = name
}
static maxInstancesReached() {
if (!this.numOfCreatedInstances)
this.numOfCreatedInstances = 0
return ++this.numOfCreatedInstances > 3
}
}
const foo1 = new Foo('Jack')
const foo2 = new Foo('John')
const foo3 = new Foo('Mary')
const foo4 = new Foo('Rebecca')

答案 1 :(得分:3)
这可以通过使用工厂功能来实现:
class Special {
}
let specialObjectCounter = 0;
function createSpecial() {
// factory function
if (specialObjectCounter === 3) return;
specialObjectCounter++;
return new Special();
}
const a = createSpecial();
const b = createSpecial();
const c = createSpecial();
const d = createSpecial();
const e = createSpecial();
console.log(a, b, c, d, e);

更通用的版本如下所示:
function instanceLimiter(proto, count, action=()=>undefined) {
let counter = 0;
return function(...args) {
if (counter >= count) return action();
counter++;
return new proto(...args);
}
}
// Demo
class Special {
}
const createSpecial = instanceLimiter(Special, 3);
const res = Array.apply(null, Array(5)).map(createSpecial);
console.log(...res);

如果您更喜欢投掷而不是返回undefined
,则可以将其他action
传递给instanceLimiter
:
instanceLimiter(Special, 3, () => {throw 'Maximum instance count reached'});
答案 2 :(得分:2)
创建静态变量并在每次创建新实例时递增计数。如果count
达到阈值,则抛出错误。
var Foo = function() {
if (Foo.instances >= 3) {
throw new Error("Max number of instances reached");
}
Foo.instances++;
};
Foo.instances = 0;
var a = new Foo();
console.log(a);
var b = new Foo();
console.log(b);
var c = new Foo();
console.log(c);
console.log(Foo.instances);
var d = new Foo();
console.log(d);