2016-01-19 11 views
12

में निजी गुण और विधियां हैं IIS सिर्फ ईएस 6 की कोशिश कर रहा हूं और नियमित जावास्क्रिप्ट में ईएस 6 में लिखे गए कोड के एक हिस्से को फिर से लिखना चाहता हूं। और अब, मैं ES6 कक्षाओं में निजी गुणों और विधियों को फिर से लिखने की कोशिश करते समय अटक गया हूं। ऐसा लगता है कि ईएस 6 में कक्षाएं निजी डेटा या विधियों के लिए स्पष्ट रूप से कुछ भी प्रदान नहीं करती हैं।ईएस 6 कक्षाओं

इसके अलावा, मैंने इस धागे की जांच की: Private properties in JavaScript ES6 classes और पता चला कि हम निजी डेटा स्टोर करने के लिए WeakMap का उपयोग कर सकते हैं। जो अजीब तरह का है लेकिन फिर भी यह एक काम हो सकता है। और मैंने इसे निजी डेटा के लिए उपयोग करने का प्रबंधन किया।

लेकिन निजी तरीकों के बारे में क्या? ES6 कक्षाओं में निजी विधियों (या यहां तक ​​कि संरक्षित विधियां) रखने का अनुशंसित तरीका क्या है?

यदि कोई मुझे निजी तरीकों के साथ ईएस 6 कक्षा का उपयोग कर कोड के इस भाग को फिर से लिखने के लिए स्वच्छ साफ़ कर सकता है तो मैं सराहना करता हूं।

धन्यवाद।

function Deferred() { 

    // Private data 
    var isPending; 
    var handlers = { 
     resolve: [], 
     reject: [], 
     notify: [] 
    }; 

    // Initialize the instance 
    init(); 

    function init() { 
     isPending = true; 
     this.promise = new Promise(this); 
    } 

    // Public methods 
    this.resolve = function(value) { 
     trigger('resolve', value); 
    }; 

    this.reject = function(reason) { 
     trigger('reject', reason); 
    }; 

    this.notify = function(value) { 
     trigger('notify', value); 
    }; 

    this.on = function(event, handler) { 
     ... 
    }; 

    // Private method 
    function trigger (event, params) { 
     ... 
    } 
} 
+0

[* एमडीएन: कक्षाएं *] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes) आलेख में पर्याप्त जानकारी होनी चाहिए। – RobG

उत्तर

12

यह ES6 में कक्षाओं को स्पष्ट रूप से निजी डेटा या तरीकों के लिए कुछ भी प्रदान नहीं करता है की तरह लगता है:

यहाँ सादे पुराने जावास्क्रिप्ट कोड है।

सही। class सिंटैक्स प्रोटोटाइप विधियों के साथ सामान्य कक्षाओं के लिए है। आप निजी चर चाहते हैं, आप हमेशा की तरह निर्माता में डाल:

class Deferred { 
    constructor() { 
     // initialise private data 
     var isPending = true; 
     var handlers = { 
      resolve: [], 
      reject: [], 
      notify: [] 
     }; 

     // Private method 
     function trigger(event, params) { 
      ... 
     } 

     // initialise public properties 
     this.promise = new Promise(this); 

     // and create privileged methods 
     this.resolve = trigger.bind(null, 'resolve'); 
     this.reject = trigger.bind(null, 'reject'); 
     this.notify = trigger.bind(null, 'notify'); 

     this.on = function(event, handler) { 
      … 
     }; 
    } 
} 
+3

ठीक लगता है। लेकिन, अगर यह एकमात्र तरीका है, तो मुझे लगता है कि पुराने जावास्क्रिप्ट 'फ़ंक्शन()' शैली के साथ रहने के लिए यह अधिक "क्लीनर" होगा। चूंकि इस परिदृश्य में ईएस 6 कक्षाओं के साथ हम बहुत कुछ नहीं कर सकते हैं। – kabirbaidhya

+0

वैसे मैं उम्मीद करता हूं कि आपके पास कम से कम कुछ प्रोटोटाइप विधियां हों, है ना? – Bergi

+4

यहां "निजी" सामान केवल निर्माता में उपलब्ध है। आपको काम करने के लिए क्लास गेटर्स और सेटर और क्लास विधियों का उपयोग करना होगा (या कम से कम उन लोगों में जो "निजी" सदस्यों को शामिल करेंगे)। इस मामले में, आप एक ऑब्जेक्ट जेनरेटिंग फ़ंक्शन में कम हो जाते हैं, जो वास्तव में "पारंपरिक" वर्ग कार्यों से अलग नहीं है। –

3

आप प्रतीकों का उपयोग कर सकते हैं एक तरह-के निजी सदस्य देने के लिए।

const KEY = Symbol('key') 
const ANOTHER = Symbol('another') 

class Foo { 
    constructor() { 
    this[ KEY ] = 'private' 
    } 

    say() { 
    console.log(this[ KEY ]) 
    } 

    [ ANOTHER ] = 'transpilation required' 
} 

2 प्रतीक वर्ग एक class field का उपयोग कर में जोड़ा जाता है, यह केवल प्रस्ताव में है और कहीं भी काम करने के लिए transpilation की आवश्यकता होगी, लेकिन बाकी नोड और नए ब्राउज़रों में काम करता है।

+0

यह अजीब वाक्यविन्यास है, और एक हैक की तरह थोड़ा लगता है, लेकिन यह निश्चित रूप से काम करता है और मूल रूप से वास्तविक निजी सदस्यों के बराबर है। –

+1

हालांकि मैं यह भी एक अच्छा विचार था, लेकिन संपत्ति वास्तव में निजी नहीं है। आप 'instance.key' के साथ मान तक नहीं पहुंच सकते हैं, लेकिन आप अभी भी 'instance [Object.getOwnPropertySymbols (instance) .filter (s => s.toString() का उपयोग कर सकते हैं। (/^प्रतीक \ ((^ ^]] +) \) $ /, '$ 1') === 'कुंजी') [0]] ' – Neovov

+0

अच्छी तरह से, आप यह कर सकते हैं ... – artparks

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