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


Answers

आप हमेशा सामान्य कार्यों का उपयोग कर सकते हैं:

function myPrivateFunction() {
  console.log("My property: " + this.prop);
}

class MyClass() {
  constructor() {
    this.prop = "myProp";
    myPrivateFunction.bind(this)();
  }
}

new MyClass(); // 'My property: myProp'
Question

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

मैं अब 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 मॉड्यूल वैश्विक नामस्थान में नहीं हैं। इसलिए, जो कुछ भी आप अपने मॉड्यूल में घोषित करते हैं और निर्यात नहीं करते हैं, वह आपके प्रोग्राम के किसी अन्य भाग के लिए उपलब्ध नहीं होगा, लेकिन फिर भी आपके मॉड्यूल में रन टाइम के दौरान उपलब्ध होगा।

लेकिन उनका उदाहरण यह नहीं दिखाया कि कैसे निजी विधि वर्ग के उदाहरण के सदस्यों तक पहुंच सकती है। हमें कुछ अच्छे उदाहरण दिखाता है कि कैसे बाध्यकारी या कन्स्ट्रक्टर में लैम्ब्डा विधि का उपयोग करने के विकल्प के माध्यम से एक्सेस सदस्यों को एक्सेस करते हैं, लेकिन मैं इसे करने का एक और आसान तरीका जोड़ना चाहता हूं: उदाहरण को निजी विधि के पैरामीटर के रूप में पास करना। ऐसा करने से मैक्स के माइक्लास को इस तरह दिखने का मौका मिलेगा:

function myPrivateFunction(myClass) {
  console.log("My property: " + myClass.prop);
}

class MyClass() {
  constructor() {
    this.prop = "myProp";
  }
  testMethod() {
    myPrivateFunction(this);
  }
}
module.exports = MyClass;

आप इसे किस तरह से करते हैं वास्तव में व्यक्तिगत वरीयता के लिए नीचे आता है।




आप प्रतीक का उपयोग कर सकते हैं

var say = Symbol()

function Cat(){
  this[say]() // call private methos
}

Cat.prototype[say] = function(){ alert('im a private') }

पीएस एलेक्सपोड सही नहीं है। वह निजी के बजाय सुरक्षा प्राप्त करता है, क्योंकि विरासत एक नाम संघर्ष है

असल में आप var say = String(Math.random()) उपयोग प्रतीक के बजाय कर सकते हैं

ईएस 6 में:

var say = Symbol()

class Cat {

  constructor(){
    this[say]() // call private
  }

  [say](){
    alert('im private')
  }

}



मुझे आशा है कि यह सहायक हो सकता है। :)

I. आईआईएफई (तत्काल-चालित फ़ंक्शन अभिव्यक्ति) के अंदर वर्रों , कार्यों को घोषित करना, जिनका उपयोग केवल अज्ञात फ़ंक्शन में किया जा सकता है। (जब आपको ES6 के लिए कोड बदलने की आवश्यकता होती है तो 'var' का उपयोग किये बिना "चलो, कॉन्स" कीवर्ड का उपयोग करना अच्छा हो सकता है।)

let Name = (function() {
  const _privateHello = function() {
  }
  class Name {
    constructor() {
    }
    publicMethod() {
      _privateHello()
    }
  }
  return Name;
})();

द्वितीय। WeakMap ऑब्जेक्ट मेमोरीक परेशानी के लिए अच्छा हो सकता है।

उदाहरण हटा दिए जाने पर WeakMap में संग्रहीत चर हटा दिए जाएंगे। इस लेख को जांचें। ( ईएस 6 कक्षाओं के निजी डेटा का प्रबंधन )

let Name = (function() {
  const _privateName = new WeakMap();
})();

तृतीय। चलो सब एक साथ रखो।

let Name = (function() {
  const _privateName = new WeakMap();
  const _privateHello = function(fullName) {
    console.log("Hello, " + fullName);
  }

  class Name {
    constructor(firstName, lastName) {
      _privateName.set(this, {firstName: firstName, lastName: lastName});
    }
    static printName(name) {
      let privateName = _privateName.get(name);
      let _fullname = privateName.firstName + " " + privateName.lastName;
      _privateHello(_fullname);
    }
    printName() {
      let privateName = _privateName.get(this);
      let _fullname = privateName.firstName + " " + privateName.lastName;
      _privateHello(_fullname);
    }
  }

  return Name;
})();

var aMan = new Name("JH", "Son");
aMan.printName(); // "Hello, JH Son"
Name.printName(aMan); // "Hello, JH Son"



Related