2016-04-26 68 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,這個例子顯示了一些關於你可以用它做什麼的巧妙技巧。