javascript - Traceur के साथ ES6 कक्षा में निजी विधि को कैसे कार्यान्वित करें




5 Answers

वर्तमान ईसीएमएस्क्रिप्ट 6 विनिर्देश में कोई private , public या protected कीवर्ड नहीं हैं।

तो Traceur private और public समर्थन नहीं करता है। 6to5 (वर्तमान में इसे "बेबेल" कहा जाता है) प्रयोगात्मक उद्देश्य के लिए इस प्रस्ताव को महसूस करता है ( यह चर्चा भी देखें)। लेकिन यह सिर्फ प्रस्ताव है, आखिरकार।

तो अब के लिए आप केवल WeakMap माध्यम से निजी गुणों का अनुकरण कर सकते हैं ( here देखें)। एक अन्य विकल्प Symbol - लेकिन यह किसी भी गोपनीयता को इंगित नहीं करता है क्योंकि Object.getOwnPropertySymbols को आसानी से Object.getOwnPropertySymbols . Object.getOwnPropertySymbols माध्यम से Object.getOwnPropertySymbols किया जा सकता है।

आईएमएचओ इस समय सबसे अच्छा समाधान - बस छद्म गोपनीयता का उपयोग करें। यदि आप अक्सर अपनी विधि के साथ apply या call उपयोग करते हैं, तो यह विधि बहुत ऑब्जेक्ट विशिष्ट है। तो अंडरस्कोर उपसर्ग के साथ बस अपनी कक्षा में इसे घोषित करना उचित है:

class Animal {

    _sayHi() {
        // do stuff
    }
}

इस प्रश्न का उत्तर यहां दिया गया है:

मैं अब ES6 सुविधाओं के साथ लाभ लेने के लिए Traceur कंपाइलर का उपयोग करें।

मैं ES5 से इस सामान को लागू करना चाहता हूं:

function Animal() {
    var self = this,
        sayHi;

    sayHi  = function() {
        self.hi();
    };

    this.hi = function() {/* ... */}
}

वर्तमान में traceur private और public कीवर्ड ( सद्भाव से ) का समर्थन नहीं करता है। और ईएस 6 कक्षा वाक्यविन्यास वर्ग निकाय में सरल var (या let ) कथन का उपयोग करने की अनुमति नहीं देता है।

क्लास घोषणा से पहले निजीकरण को अनुकरण करना एकमात्र तरीका है। कुछ इस तरह:

var sayHi = function() {
    // ... do stuff
};

class Animal {
...

यह तब बेहतर नहीं है, लेकिन उम्मीद के मुताबिक आप बिना किसी apply इसे निजी तरीके से सही तरीके से पारित नहीं कर सकते हैं या इसे हर बार bind सकते हैं।

तो, क्या ट्रेसीर कंपाइलर के साथ संगत ईएस 6 कक्षा में निजी डेटा का उपयोग करने की कोई संभावना है?




यद्यपि वर्तमान में कोई विधि या संपत्ति निजी के रूप में घोषित करने का कोई तरीका नहीं है, ईएस 6 मॉड्यूल वैश्विक नामस्थान में नहीं हैं । इसलिए, जो कुछ भी आप अपने मॉड्यूल में घोषित करते हैं और निर्यात नहीं करते हैं , वह आपके प्रोग्राम के किसी अन्य भाग के लिए उपलब्ध नहीं होगा , लेकिन फिर भी आपके मॉड्यूल में रन टाइम के दौरान उपलब्ध होगा। इस प्रकार, आपके पास निजी गुण और विधियां हैं :)

यहां एक उदाहरण है ( test.js फ़ाइल में)

function tryMe1(a) {
  console.log(a + 2);
}

var tryMe2 = 1234;

class myModule {
  tryMe3(a) {
    console.log(a + 100);
  }

  getTryMe1(a) {
    tryMe1(a);
  }

  getTryMe2() {
    return tryMe2;
  }
}

// Exports just myModule class. Not anything outside of it.
export default myModule; 

एक और फाइल में

import MyModule from './test';

let bar = new MyModule();

tryMe1(1); // ReferenceError: tryMe1 is not defined
tryMe2; // ReferenceError: tryMe2 is not defined
bar.tryMe1(1); // TypeError: bar.tryMe1 is not a function
bar.tryMe2; // undefined

bar.tryMe3(1); // 101
bar.getTryMe1(1); // 3
bar.getTryMe2(); // 1234



जैसा कि एलेक्सपोड कहते हैं, ES6 में ऐसा करने का कोई समर्पित तरीका नहीं है। हालांकि, रुचि रखने वालों के लिए, बाइंड ऑपरेटर के लिए भी एक प्रस्ताव है जो इस तरह के वाक्यविन्यास को सक्षम बनाता है:

function privateMethod() {
  return `Hello ${this.name}`;
}

export class Animal {
  constructor(name) {
    this.name = name;
  }
  publicMethod() {
    this::privateMethod();
  }
}

एक बार फिर, यह सिर्फ एक प्रस्ताव है। आपकी माइलेज भिन्न हो सकती है।




क्या आपने कारखाने के कार्यों का उपयोग करने पर विचार किया है? वे आमतौर पर जावास्क्रिप्ट में कक्षाओं या कन्स्ट्रक्टर कार्यों के लिए एक बेहतर विकल्प हैं । यहां एक उदाहरण दिया गया है कि यह कैसे काम करता है:

function car () {

    var privateVariable = 4

    function privateFunction () {}

    return {

        color: 'red',

        drive: function (miles) {},

        stop: function() {}

        ....

    }

}

बंद करने के लिए धन्यवाद, आपके पास लौटे ऑब्जेक्ट के अंदर सभी निजी फ़ंक्शंस और वेरिएबल्स तक पहुंच है, लेकिन आप उन्हें बाहर से नहीं एक्सेस कर सकते हैं।




मैं जो महसूस करता हूं उसके साथ आया, यह एक बेहतर समाधान है:

  • 'this._' की आवश्यकता नहीं है, वह / स्वयं, कमजोर, प्रतीक इत्यादि स्पष्ट और सीधा 'वर्ग' कोड

  • निजी चर और विधियां वास्तव में निजी हैं और सही 'यह' बाध्यकारी है

  • 'इस' का कोई उपयोग नहीं, जिसका अर्थ स्पष्ट कोड है जो बहुत कम त्रुटि प्रवण है

  • सार्वजनिक इंटरफ़ेस स्पष्ट है और कार्यान्वयन से निजी तरीकों के लिए प्रॉक्सी के रूप में अलग किया गया है

  • आसान संरचना की अनुमति देता है

इसके साथ आप कर सकते हैं:

function Counter() {
  // public interface
  const proxy = {
    advance,  // advance counter and get new value
    reset,    // reset value
    value     // get value
  }
	
  // private variables and methods
  let count=0;
    
  function advance() {
    return ++count;
  }
    	
  function reset(newCount) {
    count=(newCount || 0);
  }
    	
  function value() {
    return count;
  }
    
  return proxy;
}
    	
let counter=Counter.New();
console.log(counter instanceof Counter); // true
counter.reset(100);
console.log('Counter next = '+counter.advance()); // 101
console.log(Object.getOwnPropertyNames(counter)); // ["advance", "reset", "value"]
<script src="https://cdn.rawgit.com/kofifus/New/7987670c/new.js"></script>

कोड के लिए New और कन्स्ट्रक्टर और संरचना सहित अधिक विस्तृत उदाहरण देखें




Related

javascript class ecmascript-5 ecmascript-6 traceur