2016-02-06 17 views
5

Có cách nào tôi có thể xác định một const trong hàm tạo của một lớp không?Xác định một const trong hàm tạo lớp (ES6)

Tôi cố gắng này:

class Foo { 
    constructor() { 
     const bar = 42; 
    } 

    getBar =() => { 
     return this.bar; 
    } 
} 

Nhưng

var a = new Foo(); 
console.log (a.getBar()); 

lợi nhuận không xác định.

+0

@Bergi Thậm chí không giống với những gì tôi yêu cầu. – alexandernst

+0

Vâng [it] (http://stackoverflow.com/questions/13418669/javascript-do-i-need-to-put-this-var-for-every-variable-in-an-object) giải thích sự khác biệt giữa biến và thuộc tính, mà bạn dường như có vấn đề. Phải thừa nhận rằng, nó không cho bạn biết làm thế nào để xác định các thuộc tính không thể ghi. – Bergi

Trả lời

13

Bạn sử dụng các thuộc tính read-only tĩnh để khai báo giá trị không đổi được scoped đến một lớp học.

class Foo { 
    static get BAR() { 
     return 42; 
    } 
} 

console.log(Foo.BAR); // print 42. 
Foo.BAR = 43; // triggers an error 
+1

Thực ra, '=>' không nên ở đó. – alexandernst

+0

@alexandernst cảm ơn. – cgTag

0

Vấn đề là với "thanh" Phạm vi - nó scoped để constructor:

'use strict'; 

class Foo { 
    constructor() { 
     const bar = 42; 
     this.bar = bar; // scoping to the class 
    } 

    getBar() { 
     return this.bar; 
    } 
} 

var a = new Foo(); 
console.log (a.getBar()); 
+0

Ah, tôi hiểu rồi. Làm theo cách này, các thuộc tính của 'const' được duy trì, đúng không? – alexandernst

+1

@alexandernst - không, 'this.bar' sẽ không phải là hằng số, và có thể bị ghi đè – adeneo

+1

Vậy thì điểm của' const' là gì nếu nó không thể được sử dụng trong một lớp? – alexandernst

1

Chỉ cần xác định một hằng số trong hàm tạo sẽ không đính kèm nó vào thể hiện, bạn phải đặt nó bằng cách sử dụng this. Tôi đoán bạn muốn không thay đổi, vì vậy bạn có thể sử dụng getters:

class Foo { 
    constructor() { 
     this._bar = 42; 
    } 

    get bar() { 
     return this._bar; 
    } 
} 

Sau đó, bạn có thể sử dụng nó như bạn thường:

const foo = new Foo(); 
console.log(foo.bar) // 42 
foo.bar = 15; 
console.log(foo.bar) // still 42 

này sẽ không ném ra một lỗi khi cố gắng thay đổi bar. Bạn có thể nêu ra lỗi trong setter nếu bạn muốn:

class Foo { 
    constructor() { 
     this._bar = 42; 
    } 

    get bar() { 
     return this._bar; 
    } 

    set bar(value) { 
     throw new Error('bar is immutable.'); 
    } 
} 
Các vấn đề liên quan