2015-01-28 8 views
7

के रूप में फ़ंक्शन को लागू करना मैं कॉफीस्क्रिप्ट से ES6 (6to5 और ब्राउज़रify का उपयोग करके) से एक प्रोजेक्ट माइग्रेट कर रहा हूं, और संभवतः एक सीमा में चल रहा हूं या शायद मुझे उचित वाक्यविन्यास नहीं पता है। कॉफीस्क्रिप्ट में मैं यह कर सकता था:ES6: क्लास विधि

class SomeView extends BaseView 
    triggerMethod: Marionette.triggerMethod 

मैं इसे ES6 कक्षाओं में कैसे व्यक्त करूं? मैंने कुछ चीजों की कोशिश की, लेकिन यह Unexpected token त्रुटियों को फेंकता है इससे कोई फर्क नहीं पड़ता कि मैं क्या प्रयास करता हूं। इस उदाहरण के लिए:

let { triggerMethod } = Marionette; 

class SomeView extends BaseView { 
    triggerMethod, // doesn't work 
    triggerMethod: Marionette.triggerMethod // doesn't work 
} 

अब मैं इस निर्माता (this.triggerMethod = Marionette.triggerMethod) में निर्धारित कर उसे प्राप्त कर सकते हैं, लेकिन यह थोड़ा मेरे लिए बदसूरत (शैली कोडिंग मुझे लगता है कि में सिर्फ एक वरीयता) लगता है। किसी भी सहायता की सराहना की जाएगी।

उत्तर

12

आप ES6 कक्षाएं, केवल तरीकों और स्थिर तरीकों में गुण की घोषणा नहीं कर सकते हैं (वर्ग घोषणा की वाक्य रचना के लिए here देखते हैं, ClassElement पर ध्यान देना)। तो निम्न उदाहरण के किसी भी गलत हो जाएगा:

class A { 
    method1: B.someMethod // wrong! 
    method2: function() {} // wrong! 
    method3:() => {}  // wrong! 
} 

आप आपकी समस्या को संभालने के लिए कई प्रकार हैं:

  1. उपयोग गेटर: SomeView की triggerMethod से

    class SomeView extends BaseView { 
        get triggerMethod() { return Marionette.triggerMethod } 
    } 
    
  2. कॉल Marionette.triggerMethod कक्षा:

  3. वर्ग घोषणा के बाद SomeView के प्रोटोटाइप को triggerMethod जोड़ें:

    class SomeView extends BaseView { 
        //.. some class declaration 
    } 
    SomeView.prototype.triggerMethod = Marionette.triggerMethod; 
    

    या Object.assign साथ:

    class SomeView extends BaseView { 
        //.. some class declaration 
    } 
    
    Object.assign(SomeView.prototype, { 
        triggerMethod: Marionette.triggerMethod 
        // ... some another methods 
    }); 
    
  4. क्या आप पहले से ही था - Marionette.triggerMethodthis में जोड़ें। लेकिन आपको अवगत होना चाहिए कि उस मामले में triggerMethod ऑब्जेक्ट में ही रखा जाएगा, न कि इसके प्रोटोटाइप में। उदाहरण:

    class SomeView extends BaseView { 
        constructor() { 
         this.triggerMethod = Marionette.triggerMethod 
         // ... 
        } 
    } 
    

तुम सब क्या कर सकते हैं यही कारण है कि। मुझे लगता है कि पहले और दूसरे संस्करण आपके मामले के लिए सबसे अच्छे विकल्प हैं, लेकिन यह स्वाद का विषय है।

-1

अगर मैं यह अधिकार आपको वर्ग तरीकों इस तरह से परिभाषित कर सकते हैं मिल गया:

class SomeView extends BaseView { 
    triggerMethod(){ 
     Marionette.triggerMethod; 
    } 
} 
सुंदर ज्यादा

Coffeescript में के रूप में ही है, लेकिन कुछ ब्रेसिज़ आवश्यक हैं। मैं इस प्रयास नहीं किया है, लेकिन देखना http://wiki.ecmascript.org/doku.php?id=harmony:classes

+4

जिस तरीके से आपने इसे परिभाषित किया है, 'triggerMethod' वास्तव में कुछ भी नहीं करता है। यह 'Marionette.triggerMethod' का संदर्भ देता है, लेकिन यह इसे निष्पादित नहीं करता है। –

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