टाइपप्रति निजी सदस्यों

वोट
76

मैं टाइपप्रति में निजी सदस्यों के कार्यान्वयन में देख रहा हूँ, और मैं इसे एक छोटे से संशय है। IntelliSense निजी सदस्य का उपयोग करने की अनुमति नहीं है, लेकिन शुद्ध जावास्क्रिप्ट में, यह सब नहीं है। यह मैं लगता है कि टीएस निजी सदस्यों को सही ढंग से लागू नहीं करता है बनाता है। कोई विचार?

class Test{
  private member: any = private member;
}
alert(new Test().member);
03/10/2012 को 18:24
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


7 जवाब

वोट
68

बस प्रकार की जाँच के साथ के रूप में सदस्यों की गोपनीयता केवल संकलक के भीतर लागू होते हैं।

एक निजी संपत्ति एक नियमित रूप से संपत्ति के रूप में कार्यान्वित किया जाता है, और कक्षा के बाहर कोड यह देखने की अनुमति नहीं है।

वर्ग के अंदर सही मायने में निजी कुछ बनाने के लिए, यह वर्ग के एक सदस्य नहीं हो सकता, यह एक स्थानीय एक समारोह गुंजाइश कोड है कि वस्तु बनाता है अंदर अंदर बनाया चर होगा। इसका मतलब यह है कि आप इसे वर्ग के एक सदस्य की तरह उपयोग नहीं कर सकते, का उपयोग करते हुए यानी होता thisकीवर्ड।

03/10/2012 को 18:36
का स्रोत उपयोगकर्ता

वोट
33

जावास्क्रिप्ट निजी चर समर्थन करता है।

function MyClass() {
    var myPrivateVar = 3;

    this.doSomething = function() {
        return myPrivateVar++;        
    }
}

टाइपप्रति में यह इतना तरह व्यक्त किया जाएगा:

class MyClass {

    doSomething: () => number;

    constructor() {
        var myPrivateVar = 3;

        this.doSomething = function () {
            return myPrivateVar++;
        }
    }
}

संपादित करें

यह दृष्टिकोण केवल इस्तेमाल किया जाना चाहिए किफ़ायत से जहां यह बिल्कुल जरूरी है। उदाहरण के लिए आप अस्थायी रूप से एक पासवर्ड कैश करने के लिए की जरूरत है।

इस पैटर्न (जावास्क्रिप्ट या टाइपप्रति के अप्रासंगिक) का उपयोग करने के लिए प्रदर्शन खर्च कर रहे हैं और केवल जहां बिल्कुल जरूरी किया जाना चाहिए।

06/06/2014 को 17:01
का स्रोत उपयोगकर्ता

वोट
11

एक बार के लिए समर्थन WeakMap अधिक व्यापक रूप से उपलब्ध है वहाँ एक दिलचस्प तकनीक # 3 उदाहरण में विस्तृत है यहाँ

यह निजी डेटा के लिए अनुमति देता है और डेटा केवल उदाहरण के तरीकों के बजाय प्रोटोटाइप तरीकों से सुलभ हो करने की अनुमति देकर जेसन इवांस उदाहरण के प्रदर्शन लागत से बचाव।

जुड़ा हुआ MDN WeakMap क्रोम 36, फायरफॉक्स 6.0, IE 11, ओपेरा 23, और सफारी 7.1 पर पेज सूचियों ब्राउज़र समर्थन करते हैं।

let _counter = new WeakMap();
let _action = new WeakMap();
class Countdown {
  constructor(counter, action) {
    _counter.set(this, counter);
    _action.set(this, action);
  }
  decrement() {
    let counter = _counter.get(this);
    if (counter < 1) return;
    counter--;
    _counter.set(this, counter);
    if (counter === 0) {
      _action.get(this)();
    }
  }
}
10/04/2016 को 04:23
का स्रोत उपयोगकर्ता

वोट
3

इस मुद्दे पर आधिकारिक चर्चा के लिए लिंक के लिए शॉन फेल्डमैन के लिए धन्यवाद - देख उसके जवाब कड़ी के लिए।

मैं चर्चा वह से जुड़ा हुआ पढ़ा है, और यहाँ महत्वपूर्ण बिंदुओं का एक सारांश है:

  • सुझाव: निर्माता में निजी संपत्तियों
    • समस्याओं: प्रोटोटाइप कार्यों से उपयोग नहीं कर सकते
  • सुझाव: निर्माता में निजी तरीकों
    • समस्याओं: गुणों के साथ के रूप में ही है, साथ ही आप प्रोटोटाइप में प्रति कक्षा एक बार एक समारोह बनाने के प्रदर्शन को लाभ खो देते हैं; इसके बजाय आप प्रत्येक उदाहरण के लिए समारोह की एक प्रतिलिपि बनाने
  • सुझाव: सार संपत्ति का उपयोग करने के लिए बॉयलरप्लेट जोड़ सकते हैं और दृश्यता लागू
    • समस्याओं: प्रमुख प्रदर्शन भूमि के ऊपर; टाइपप्रति बड़े अनुप्रयोगों के लिए डिज़ाइन किया गया है
  • सुझाव: टाइपप्रति पहले से ही एक बंद में निर्माता और प्रोटोटाइप विधि परिभाषाओं लपेटता; वहाँ निजी तरीकों और गुण डाल
    • कि बंद में निजी संपत्तियों डालने के साथ समस्याओं: वे स्थैतिक चर हो जाते हैं; वहाँ उदाहरण के प्रति एक नहीं है
    • कि बंद में निजी तरीकों डालने के साथ समस्याओं: वे करने के लिए पहुँच नहीं है thisवैकल्पिक हल के कुछ प्रकार के बिना
  • सुझाव: स्वचालित रूप से निजी चर नाम वध
    • काउंटर तर्क: कि एक नामकरण परंपरा है, न कि भाषा निर्माण है। यह अपने आप को नष्ट करना
  • सुझाव: के साथ निजी तरीकों पर टिप्पणी करें @privateतो minifiers कि कि एनोटेशन पहचान प्रभावी रूप से विधि के नाम कम करें कर सकते हैं
    • यह एक करने के लिए कोई महत्वपूर्ण काउंटर तर्क

उत्सर्जित कोड में दृश्यता समर्थन जोड़ने के लिए कुल मिलाकर जवाबी तर्क:

  • इस टाइपप्रति की समस्या नहीं है - समस्या यह है कि स्वयं JavaScript दृश्यता संशोधक नहीं है
  • वहाँ पहले से ही जावास्क्रिप्ट समुदाय में एक स्थापित पैटर्न है: उपसर्ग निजी संपत्तियों और एक अंडरस्कोर, जो कहते हैं के साथ तरीकों "को अपने जोखिम पर आगे बढ़ना"
  • जब टाइपप्रति डिजाइनरों ने कहा कि सही मायने में निजी संपत्तियों और विधियों "संभव" नहीं हैं, वे मतलब था "हमारे डिजाइन सीमा के अन्दर संभव नहीं", विशेष रूप से:
    • उत्सर्जित जे एस मुहावरेदार है
    • बॉयलरप्लेट कम है
    • कोई अतिरिक्त भूमि के ऊपर सामान्य जे एस OOP की तुलना
06/10/2016 को 14:51
का स्रोत उपयोगकर्ता

वोट
2

टाइपप्रति में निजी कार्यों वर्ग के अंदर ही सुलभ हैं। पसंद

यहाँ छवि विवरण दर्ज

और यह जब आप एक निजी सदस्य तक पहुँचने का प्रयास एक त्रुटि दिखाई देगा। यहाँ उदाहरण है:

यहाँ छवि विवरण दर्ज

नोट: यह जावास्क्रिप्ट के साथ ठीक हो जाएगा और दोनों समारोह के बाहर से सुलभ हैं।

15/07/2016 को 07:33
का स्रोत उपयोगकर्ता

वोट
1

मुझे पता है यह एक बड़ी चर्चा है लेकिन यह अभी भी संकलित जावास्क्रिप्ट वर्ग के सार्वजनिक इंटरफ़ेस में बाहर "लीक" माना जाता है कि निजी चर और एक टाइपप्रति में तरीकों की समस्या के लिए मेरे समाधान साझा करने के लिए उपयोगी हो सकता है।

मेरे लिए इस मुद्दे को, विशुद्ध रूप से कॉस्मेटिक है यानी यह सब के बारे में दृश्य अव्यवस्था जब एक उदाहरण चर DevTools में देखा जाता है है। मेरे ठीक एक और वर्ग है कि फिर मुख्य वर्ग में instantiated है और एक को सौंपा गया है अंदर एक साथ समूह निजी घोषणाओं के लिए है privateकी तरह एक नाम के साथ (लेकिन अभी भी जे एस में सार्वजनिक रूप से दिखाई) चर __(डबल अंडरस्कोर)।

उदाहरण:

class Privates {
    readonly DEFAULT_MULTIPLIER = 2;
    foo: number;
    bar: number;

    someMethod = (multiplier: number = this.DEFAULT_MULTIPLIER) => {
        return multiplier * (this.foo + this.bar);
    }

    private _class: MyClass;

    constructor(_class: MyClass) {
        this._class = _class;
    }
}

export class MyClass {
    private __: Privates = new Privates(this);

    constructor(foo: number, bar: number, baz: number) {
        // assign private property values...
        this.__.foo = foo;
        this.__.bar = bar;

        // assign public property values...
        this.baz = baz;
    }

    baz: number;

    print = () => {
        console.log(`foo=${this.__.foo}, bar=${this.__.bar}`);
        console.log(`someMethod returns ${this.__.someMethod()}`);
    }
}

let myClass = new MyClass(1, 2, 3);

जब myClassउदाहरण के बजाय सही मायने में जनता (जो बहुत नेत्रहीन ठीक से पुनर्संशोधित वास्तविक जीवन कोड में गन्दा प्राप्त कर सकते हैं) के साथ intermixed सभी अपने "निजी" के सदस्यों को देखने का, DevTools में देखा जाता है जैसा कि आप देख उन्हें बड़े करीने से ढह अंदर वर्गीकृत किया __संपत्ति:

यहाँ छवि विवरण दर्ज

14/09/2018 को 22:12
का स्रोत उपयोगकर्ता

वोट
0

बहुत से लोग दावा करते हैं इस वजह जावास्क्रिप्ट में सीमाओं के संभव नहीं है। मैं इसे JavaScript डेवलपर 'रचनात्मकता में सीमाओं है कहेंगे।

मैं एक पुस्तकालय के विकास कर रहा हूँ अभी है कि कक्षाओं के निजी और संरक्षित दाय सदस्यों, साथ ही इंटरफेस की अनुमति देता है, आदि ClassJS कहा जाता है। पर यहाँ देखें GitHub

12/04/2017 को 01:06
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more