2016-04-26 33 views
0

我在学习es6,所以我试图将这些代码从es5转换为es6。如何在es6中实现实例计数器?

我知道如何在es5中创建实例计数器。 id建立在A.prototypecounter上,建立在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工作,我该如何实现相同的功能?

+0

'id'不是建立在'A.prototype'上,而是建立在每个A实例上。 – Bergi

+0

https://babeljs.io/repl/#?evaluate=true&presets=es2015%2Creact%2Cstage-2&experimental=true&loose=false&spec=true&playground=true&code=class%20A%20%7B%0A%20%20constructor()%20 %7B%0A%20%20%20%20this.id%20%3D%20%2B%2BA.counter%3B%0A%20%20%7D%0A%7D%0A%0AA.counter%20%3D %200%3B%0A%0Aconst%20A%20%3D%20new%20A()%3B%0Aconst%20B%20%3D%20new%20A()%3B%0A%0Aconsole.log(a.id%2C %20b.id) – zerkms

回答

2

你会做完全相同的方式在ES5:

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

(你也可以,如果你想添加相同不必要IIFE)

1

的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() 
+0

这是ES6中的语法错误。 “static”关键字仅用于方法。 – Bergi

4

另外两个答案是完全正确的。但是如果你想获得超级疯狂的ES6,你可以为属性制造吸气。

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

    get id() { 
     return this._id; 
    } 

    static get counter() { 
     A._counter = (A._counter || 0) + 1; 
     return A._counter; 
    } 
} 

a = new A() // <- 1 
b = new A() // <- 2 
c = new A() // <- 3 

这样,你的柜台和id都是只读的,和你的计数器自动递增每次你访问它...加上它的所有整齐的类定义,而不是需要到外面往里走的时间。

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