限制Class可以实例化的次数

时间:2018-01-02 23:43:01

标签: javascript class instance

在JavaScript访谈中询问了以下问题。

  

创建3个类的实例后,如何防止进一步创建实例?

这是什么答案?

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);