2015-12-24 21 views
11

Tôi tự hỏi nếu sau đây là phù hợp với spec ES6:Có thể gọi một setter siêu trong các lớp được thừa kế ES6 không?

class X { 
    constructor(name) { 
    this._name = name; 
    } 

    get name() { 
    return this._name; 
    } 

    set name(name) { 
    this._name = name + "X"; 
    } 
} 

class Y extends X { 
    constructor(name) { 
    super(name); 
    } 

    set name(name) { 
    super.name = name; 
    this._name += "Y"; 
    } 
} 

Ý tưởng là let y = new Y(""); y.name = "hi" nên kết quả trong y.name === "hiXY" là sự thật.

Theo như tôi có thể biết, tính năng này không hoạt động trong Chrome có cờ ES6 được bật. Nó cũng không hoạt động khi sử dụng Babel với cờ es2015. Đang sử dụng super.name = ... trong trình thiết lập kế thừa không phải là một phần của thông số ES6? Hay đây có phải là lỗi trong việc triển khai Babel không?

+2

Xác định "không hoạt động"? Bạn đang ghi đè 'get name' từ lớp cơ sở bằng cách định nghĩa' set name' trên child mà không có 'get name() {return super.name; } '. Đó có phải là vấn đề không? – loganfsmyth

+0

@ DenysSéguret Không, bởi vì tôi muốn thiết lập của siêu để chạy (thêm một X vào cuối tên). – TAGraves

+1

@loganfsmyth Bạn nói đúng! Tôi không nhận ra rằng 'set name' sẽ ghi đè' get name'. Nó xuất hiện để làm việc một khi tôi thêm getter là tốt! Cảm ơn! – TAGraves

Trả lời

15
class Y extends X { 
    constructor(name) { 
    super(name); 
    } 

    set name(name) { 
    super.name = name; 
    this._name += "Y"; 
    } 
} 

sẽ ghi đè lên name đúng với một accessor cho chỉ setter, không có getter. Điều đó có nghĩa là y.name === "hiXY" của bạn sẽ không thành công vì y.name sẽ trả về undefined vì không có bộ thu hồi nào cho name. Bạn cần:

class Y extends X { 
    constructor(name) { 
    super(name); 
    } 

    get name(){ 
    return super.name; 
    } 

    set name(name) { 
    super.name = name; 
    this._name += "Y"; 
    } 
} 
Các vấn đề liên quan