2015-12-29 6 views
6

नोट: मैं पहले से ही नीचे तो सवाल और 7 जवाब माध्यम से चला गया इससे पहले कि आप वोट Symbols के बारे में, WeekMaps और मानचित्र (अब तक), कृपया पूर्ण प्रश्न पढ़ें: Private properties in JavaScript ES6 classes
अनुच्छेद: https://esdiscuss.org/topic/es7-property-initializersपहुँच संशोधक (निजी, संरक्षित) ES6 में

नीचे मेरी Simple Class है जो, निजी सार्वजनिक और संरक्षित गुण और तरीके शामिल हैं।

'use strict'; 
 
    class MyClass { 
 
    constructor() { 
 
     this.publicVar = 'This is Public Variable'; 
 
     this.privateVar = 'This is Private Variable'; 
 
     this.protectedVar = 'This is Protected Variable'; 
 
    } // Public Constructor Method. 
 
    
 
    publicMethod() { 
 
     console.log(' Accessing this.publicVar: ', this.publicVar); 
 
     console.log(' Accessing this.privateVar: ', this.privateVar); 
 
     console.log(' Accessing this.protectedVar: ', this.protectedVar); 
 
     return 'Its Public Method' 
 
    } // Public Method. 
 

 
    privateMethod() {return 'Its Private Method'} // Private Method. 
 
    protectedMethod() {return 'Its Protected Method'} // Protected Method. 
 

 
    foo() { 
 
     this.publicMethod(); 
 
     this.privateMethod(); 
 
     this.protectedMethod(); 
 
    } // Public Method 
 
    } // end class

मैं वस्तु instantiating रहा हूँ और सार्वजनिक विधि है जो अपेक्षा के अनुरूप काम कर रहा है बुला।

let MyObject = new MyClass; 
MyObject.foo(); // Works fine. 
console.log(MyObject.publicVar); // Works 
console.log(MyObject.publicMethod()); // Works 

उम्मीद कार्यशील के रूप में।

अब मेरा प्रश्न। मुझे पता है कि सिंबल जैसी कुछ चीजें ईएस 6 विनिर्देश में हैं, ईएस 6 कक्षाओं पर काम कर रहे संरक्षित और निजी चर/विधियों को पाने के लिए वर्तमान कार्यवाही क्या है।

console.log(MyObject.privateVar); // Works 
console.log(MyObject.privateMethod()); // Works 

मैं इस संपत्ति और विधि चाहते हैं केवल अपने ही वर्ग में दिखाई दे सकता है।

console.log(MyObject.protectedVar); // Works 
console.log(MyObject.protectedMethod()); // Works 

मैं इस संपत्ति और विधि अपने ही वर्ग है और यह विस्तार अंदर कक्षाओं में दिखाई देना चाहते हैं। इस व्यवहार को प्राप्त करने के

वर्कअराउंड/बेहतर समाधान

+4

यदि आप पहले ही सिंबल और वीकैप के बारे में पढ़ते हैं, तो आपको और क्या जानने की आवश्यकता है? –

+0

मैं उन लोगों के माध्यम से गया हूं लेकिन उदाहरण को उम्मीद कर रहा हूं कि प्रतिबंधित और विस्तारित वर्ग के दायरे के उत्तर के रूप में –

+2

ईएस 6 कक्षाओं में निजी/सुरक्षित जानबूझकर सुरक्षित नहीं है: [यहां देखें] (http://stackoverflow.com/a/22158732/ 250 9 123) वीकैप/प्रतीक उन्हें ईएस 6 कक्षाओं में जोड़ने के लिए एक कामकाज है, लेकिन जावा और सी # जैसी भाषाओं में "क्लासिक" ओओ कक्षाओं को दोहराने के बजाय, ईएस 6 कक्षाएं विधियों को परिभाषित करने का एक तरीका है। –

उत्तर

8

निजी गुण

ES6 (और पहले) की सराहना की है, सभी निजी संपत्ति कार्यान्वयन closure पर भरोसा करते हैं।

लोग have been doing it जावास्क्रिप्ट संस्करणों से पहले भी हैं। वीकैप सिर्फ एक भिन्नता है जो पहुंच की गति पर, प्रत्येक नई वस्तु के लिए नए दायरे और नए कार्यों की आवश्यकता को हटा देता है।

प्रतीक एक ईएस 6 भिन्नता है जो सामान्य परिचालनों से विशेषता को छुपाता है, जैसे सरल संपत्ति का उपयोग या for in

var MyClass; 
 
(() => { 
 
    // Define a scoped symbol for private property A. 
 
    const PropA = Symbol('A'); 
 
    // Define the class once we have all symbols 
 
    MyClass = class { 
 
    someFunction() { 
 
     return "I can read " + this[ PropA ]; // Access private property 
 
    } 
 
    } 
 
    MyClass.prototype[ PropA ] = 'Private property or method'; 
 
})(); 
 

 
// function in the closure can access the private property. 
 
var myObject = new MyClass(); 
 
alert(myObject.someFunction()); 
 

 
// But we cannot "recreate" the Symbol externally. 
 
alert(myObject[ Symbol('A') ]); // undefined 
 

 
// However if someone *really* must access it... 
 
var symbols = Object.getOwnPropertySymbols(myObject.__proto__); 
 
alert(myObject[ symbols[ 0 ] ]);

जैसा कि ऊपर देखा, यह Object.getOwnPropertySymbols() द्वारा आसपास काम किया जा सकता है। इसके अस्तित्व के बावजूद, मैं हमेशा वीकैप पर प्रतीक चुनता हूं। कोड क्लीनर, सरल, कम जीसी काम है, और (मुझे लगता है) अधिक कुशल है।

मैं व्यक्तिगत रूप से class से भी बचता हूं। Object.create बहुत आसान है। लेकिन यह दायरे से बाहर है।


संरक्षित गुण

संरक्षित गुण, अपने स्वभाव से, फ़ंक्शन को निष्पादित करने बुला कोड का उद्देश्य पता करने के लिए, न्याय के लिए कि क्या यह पहुँच प्रदान की जानी चाहिए की आवश्यकता है।

यह जे एस में असंभव है, इसलिए नहीं कि ES6 no real class है, लेकिन क्योंकि फोन करने वाले संदर्भsimply unavailable है।

variousspecialnatures जावास्क्रिप्ट के लिए, निकट भविष्य के संरक्षित गुण असंभव बने रहेंगे।

वैकल्पिक रूप से

...


पैकेज गुण

कुछ भाषाओं में अर्द्ध संरक्षित गुण होते हैं, कभी-कभी "पैकेज निजी", जहां विधि/संपत्ति ही में सदस्यों के लिए पहुँच है मॉड्यूल/पैकेज।

ES6 इसे बंद करने के साथ कार्यान्वित कर सकता है। यह बिल्कुल निजी संपत्ति कोड जैसा ही है - बस दायरे और उसके प्रतीकों को एकाधिक प्रोटोटाइप के साथ साझा करें।

लेकिन यह अव्यवहारिक है, क्योंकि इसकी आवश्यकता है कि पूरे मॉड्यूल को एक ही बंद दायरे के तहत परिभाषित किया जाए, यानी एक ही फाइल में। लेकिन फिर भी यह एक विकल्प है।

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