2015-03-09 17 views
11
class AbstractClass { 

    constructor() { 
    } 

    set property(value) { 
     this.property_ = value; 
    } 

    get property() { 
     return this.property_; 
    } 

} 

class Subclass extends AbstractClass { 

    constructor() { 
     super(); 
    } 

    set property(value) { 
     super.property = value; 
     if (!(this.property_ instanceof SubclassAssociatedClass)) throw new TypeError(); 
    } 

    //get property() { 
    // return super.property; 
    //} 

} 

Override phương pháp set của một thuộc tính và nó xuất hiện phương pháp get phải được ghi đè cũng, nếu không undefined được trả lại (ví dụ, phương pháp get không được thừa hưởng, bỏ ghi chú phương thức phân lớp get property() ở trên và mọi thứ hoạt động tốt).Override một setter và getter cũng phải được ghi đè

Tôi giả định đây là một phần của thông số, nó sẽ theo mặc dù có thể nếu hành vi là hậu quả của việc biên dịch chéo. Chỉ cần chắc chắn, đây có phải là cách chính xác để mã những người định cư bị ghi đè và getters (cả hai cùng một lúc hoặc không phải ở tất cả)?

+0

Bạn có thể chỉnh sửa ví dụ của mình để setter/getter không chỉ gọi là siêu sao? – Bergi

+1

Điều này có thể hữu ích: http://stackoverflow.com/questions/27400010/object-prototype-definegetter-and-definesetter-polyfill/27400162#27400162. Nó thảo luận vấn đề về '__defineGetter__' vv, nhưng nguyên tắc là như nhau: nếu bạn định nghĩa/xác định lại setter trên thuộc tính đã có getter, bạn cần lấy getter và reset nó cùng với setter . –

Trả lời

5

Có, đây là chủ ý (một phần của thông số kỹ thuật). Nếu một đối tượng có thuộc tính riêng (.property trong ví dụ của bạn), thuộc tính này sẽ được sử dụng và không phải là thuộc tính được kế thừa. Nếu thuộc tính đó tồn tại, nhưng là một thuộc tính accessor mà không có getter, thì undefined sẽ được trả về.

Lưu ý rằng hành vi này không thay đổi từ ES5.

+0

Chuyển sang CoffeeScript về cùng thời điểm với ES5, trước đó là '.__ defineGetter __()'/setter sẽ không bao giờ được chuẩn hóa. – user5321531

+0

@Bergi Vì tò mò, nếu bạn có thể chỉ ra một phần của thông số nêu rõ điều này, tôi sẽ biết ơn. Tôi đã thử tìm kiếm cả hai thông số kỹ thuật ES5 và ES6 nhưng không ai trong số họ dường như tuyên bố rõ ràng bất cứ điều gì về việc ghi đè getters hoặc setters. – brianpeiris

+0

@brianpeiris: "Ghi đè" xảy ra trong ['[[DefineOwnProperty]]'] (http://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods-and -internal-slots-defineownproperty-p-desc), được gọi từ [định nghĩa thuộc tính nghĩa đen] (http://www.ecma-international.org/ecma-262/6.0/#sec-method-definitions-runtime-semantics -propertydefinitionevaluation) hoặc thông qua ['Object.defineProperty'] (http://www.ecma-international.org/ecma-262/6.0/#sec-object.defineproperty) (ES5 hoạt động về cơ bản giống nhau, mặc dù các phần thông số tương ứng có thể dễ đọc hơn) – Bergi

Các vấn đề liên quan