2015-03-09 7 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; 
    //} 

} 
अधिरोहित किया जाना चाहिए

एक विशेषता के set विधि ओवरराइड और ऐसा लगता है get विधि भी अधिरोहित जा चाहिए, अन्यथा undefined दिया जाता है (यानी, get विधि विरासत में मिला नहीं है, टिप्पणी हटाएं subclass get property() ऊपर विधि और सबकुछ ठीक काम करता है)।एक सेटर ओवरराइड, और गेटर भी

मुझे लगता है कि यह कल्पना का एक हिस्सा है। हालांकि यह संभवतः अगर व्यवहार क्रॉस संकलन का परिणाम था, तो यह पालन करेगा। बस यह सुनिश्चित करने के लिए, क्या यह ओवरराइड सेटर्स और गेटर्स को कोड करने का सही तरीका है (दोनों एक ही समय में या बिल्कुल नहीं)?

+0

क्या आप अपना उदाहरण संपादित कर सकते हैं ताकि सेटर/गेटर बस सुपर कॉल नहीं कर रहा हो? – Bergi

+1

यह सहायक हो सकता है: http://stackoverflow.com/questions/27400010/object-prototype-definegetter-and-definesetter-polyfill/27400162#27400162। यह '__defineGetter__' इत्यादि के मामले में समस्या पर चर्चा करता है, लेकिन सिद्धांत समान है: यदि आप पहले से ही गेटटर प्राप्त करने वाले प्रॉपर्टी पर सेटटर को परिभाषित/पुनः परिभाषित कर रहे हैं, तो आपको गेटर को पुनर्प्राप्त करने और सेटटर के साथ इसे रीसेट करने की आवश्यकता है । –

उत्तर

5

हां, यह जानबूझकर (spec का एक हिस्सा) है। यदि किसी ऑब्जेक्ट की अपनी संपत्ति है (.property आपके उदाहरण में), तो इस संपत्ति का उपयोग किया जाएगा और विरासत में नहीं होगा। यदि वह संपत्ति मौजूद है, लेकिन गेटटर के बिना एक एक्सेसर संपत्ति है, तो undefined वापस कर दिया जाएगा।

ध्यान दें कि यह व्यवहार ES5 से नहीं बदला है।

+0

ईएस 5 के रूप में एक ही समय के बारे में कॉफीस्क्रिप्ट पर स्विच किया गया, इससे पहले '.__ परिभाषित करने वाला __() '/ सेटर कभी मानकीकृत नहीं किया जा रहा था। – user5321531

+0

@ बर्गि जिज्ञासा से बाहर, यदि आप इस बात के बारे में बता सकते हैं कि यह कहता है, तो मैं आभारी रहूंगा। मैंने ES5 और ES6 चश्मे दोनों को खोजने की कोशिश की लेकिन उनमें से कोई भी स्पष्ट रूप से गेटर्स या सेटर्स को ओवरराइड करने के बारे में कुछ भी नहीं बताता है। – brianpeiris

+0

@brianpeiris: "ओवरराइडिंग" में होता है ['[[DefineOwnProperty]]'] (http://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods-and - आंतरिक-स्लॉट-डिफिनॉउनप्रोपर्टी-पी-अवर), जिसे [शाब्दिक संपत्ति परिभाषाओं] से कहा जाता है (http://www.ecma-international.org/ecma-262/6.0/#sec-method-definitions-runtime-semantics -propertydefinitionevaluation) या ['Object.defineProperty'] के माध्यम से (http://www.ecma-international.org/ecma-262/6.0/#sec-object.defineproperty) (ES5 मूल रूप से वही काम करता है, हालांकि संबंधित स्पेक अनुभाग पढ़ने के लिए आसान हो सकता है) – Bergi

संबंधित मुद्दे