如何在es6中实现实例计数器?

时间:2016-04-26 04:04:29

标签: javascript ecmascript-6

我正在学习es6所以我试图将这些代码从es5转换为es6。

我知道如何在es5中创建一个实例计数器。构建在id上的A.prototype和基于counter的{​​{1}} A。当我按A构建实例时,它会触发counter++来设置id。因此,它实现了inheritance counter的行动。

var A = (function () {
    function A() {
        this.id = ++A.counter;
        console.log(this.id);
    }
    A.counter = 0;
    return A;
}());
a = new A();  // 1
b = new A();  // 2
c = new A();  // 3

如果我在es6工作,我该如何实现相同的功能?

4 个答案:

答案 0 :(得分:6)

其他两个答案完全正确。但如果你想获得超级疯狂的ES6,那么你可以为这些房产制造吸气剂。

d = {30:3, 54:5, 16:2}
r = d
for k,v in d.items():
    biggest = max(d,key = d.get)
    del(r[biggest])

这样你的计数器和id都是只读的,你的计数器每次访问时都会自动递增...而且它在类定义中都是整齐的,而不需要超出它。

不是说你需要这样做......但似乎你正在学习ES6,这个例子展示了一些关于你可以用它做什么的巧妙技巧。

答案 1 :(得分:3)

您完全按照与ES5相同的方式执行此操作:

[409] "@astramotor Honda All New CB150R Quantum Red #CumadiASTRAMOTOR #ASMOQuiz *21"                                                                                           
[410] "@astramotor Honda All New CB150R Quantum Red #CumadiASTRAMOTOR #ASMOQuiz *20"                                                                                           
[411] "@astramotor Honda All New CB150R Quantum Red #CumadiASTRAMOTOR #ASMOQuiz *19"                                                                                           
[412] "@astramotor Honda All New CB150R Quantum Red #CumadiASTRAMOTOR #ASMOQuiz *18"                                                                                           
[413] "@astramotor Honda All New CB150R Quantum Red #CumadiASTRAMOTOR #ASMOQuiz *17"

(如果需要,您也可以添加相同的不必要的IIFE)

答案 2 :(得分:3)

es6 class可以完成你想要的。

id不是基于A.prototype构建的,而是基于每个A实例。 constructor是做一个实例。所以你可以看一下,当A类构建一个新实例时它会this.id = ++A.counter

class A {
    constructor(){
        this.id = ++A.counter;
        console.log(this.id)
    }
}
A.counter = 0;

a = new A()
b = new A()
c = new A()

答案 3 :(得分:1)

这是一个解决方案,也像BryanGrezeszak的answer一样,也完全包含在ES6类中,但是在某些情况下可能会有用:

SaveFile

此代码的区别在于,继承的类具有自己的独立计数器。

如果您不想向构造函数添加属性,则可以替换

LoadFile

使用

class A {
  constructor() {
    this.constructor.counter = (this.constructor.counter || 0) + 1;
    this._id = this.constructor.counter;
    console.log(this.id);
  }
  get id() {
    return this._id;
  }
}

class B extends A {}
class C extends A {}

a = new B(); // <- 1
b = new C(); // <- 1
c = new B(); // <- 2
d = new A(); // <- 1

这是表达不赞成使用的当前方式

this.constructor.counter

那样,Object.getPrototypeOf(this).counter 将是该类的静态属性,而不是(静态函数)this.__proto__.counter 的属性。