2016-12-04 12 views
8

से ईएस 6 प्रॉक्सी लौटाना मैं चाहता हूं कि उपयोगकर्ता केवल किसी ऑब्जेक्ट को विशिष्ट गुण सेट करे, लेकिन साथ ही ऑब्जेक्ट कस्टम क्लास से बनाया जाना चाहिए।ES6 क्लास कन्स्ट्रक्टर

उदाहरण

लिए
var row = new Row({ 
    name : 'John Doe', 
    email : '[email protected]' 
}, Schema); 

row तरीकों हो सकता है। लेकिन जब उपयोगकर्ता row.password सेट करने का प्रयास कर रहा है, तो उन्हें अनुमति नहीं है।

ऐसा करने का एक तरीका के बजाय new Proxy का उपयोग कर रहा है, लेकिन फिर हम कक्षा के अंदर सभी अच्छी चीजें खो देंगे। मैं new Row को प्रॉक्सी ऑब्जेक्ट को this प्रॉक्सी के लक्ष्य के रूप में संदर्भित करने के लिए चाहता हूं।

किसी के पास इस पर कोई विचार है? यदि आप mongoose जानते हैं, तो mongoose यह कैसे कर रहा है?

+2

पर काम करता है क्या आप उस समस्या का वर्णन कर सकते हैं जिसे आप अधिक विस्तार से हल करने का प्रयास कर रहे हैं? आप कुछ संभावित समाधान (प्रॉक्सी का उपयोग करके) का वर्णन कर रहे हैं, लेकिन वास्तव में वर्णन नहीं करते कि आप क्या करने की कोशिश कर रहे हैं। – jfriend00

उत्तर

3

आप प्रॉक्सी का उपयोग किए बिना ऐसा कर सकते हैं।

अपनी कक्षा निर्माता में आप इस तरह पासवर्ड संपत्ति को परिभाषित कर सकते हैं:

constructor(options, schema) { 
    this.name = options.name; 
    this.email = options.email; 
    Object.defineProperty(this, 'password', { 
     configurable: false, // no re-configuring this.password 
     enumerable: true, // this.password should show up in Object.keys(this) 
     value: options.password, // set the value to options.password 
     writable: false // no changing the value with this.password = ... 
    }); 
    // whatever else you want to do with the Schema 
} 

आप कैसे MDN के Object.defineProperty() पृष्ठ पर इस का उपयोग करने के बारे में अधिक जानकारी पा सकते हैं।

+0

मेरी इच्छा ऑब्जेक्ट और ऐरे प्रॉपर्टी ऑपरेटरों को देखने की अनुमति देना है। इसका मतलब अज्ञात नाम है। कन्स्ट्रक्टर में प्रॉक्सी लौटने से यह संभव हो जाता है, नाम से गुण परिभाषित नहीं करता है। –

5

यदि प्रॉक्सी आपके लिए कुछ निश्चित है, तो सेट कार्यक्षमता को सीमित करने का एक संभावित समाधान ईएस 6 प्रॉक्सी इंस्टेंस लौटा रहा है।

डिफ़ॉल्ट रूप से, जावास्क्रिप्ट में निर्माता this स्वचालित रूप से ऑब्जेक्ट देता है लेकिन आप लक्ष्य के रूप में this पर प्रॉक्सी को तत्काल करके एक कस्टम व्यवहार को परिभाषित और वापस कर सकते हैं। ध्यान रखें कि प्रॉक्सी में सेट विधि को बूलियन मान वापस करना चाहिए।

MDN : The set method should return a boolean value. Return true to indicate that assignment succeeded. If the set method returns false, and the assignment happened in strict-mode code, a TypeError will be thrown.

class Row { 
    constructor(entry, schema) { 
    // some stuff 

    return new Proxy(this, { 
     set(target, name, value) { 
     let setables = ['name', 'email']; 
     if (!setables.includes(name)) { 
      throw new Error(`Cannot set the ${name} property`); 
     } else { 
      target[name] = value; 
      return true; 
     } 
     } 
    }); 
    } 

    get name() { 
    return this._name; 
    } 
    set name(name) { 
    this._name = name.trim(); 
    } 
    get email() { 
    return this._email; 
    } 
    set name(email) { 
    this._email = email.trim(); 
    } 
} 

तो, अब आप प्रॉक्सी के अनुसार गैर setable गुणों को सेट करने की अनुमति नहीं है।

let row = new Row({ 
    name : 'John Doe', 
    email : '[email protected]' 
}, Schema); 

row.password = 'blahblahblah'; // Error: Cannot set the password property 

भी विधि प्राप्त करने के लिए कस्टम व्यवहार करना भी संभव है।

नोट:MDN इस समय के अनुसार, handler.set() के लिए ब्राउज़र संगतता अभी तक स्पष्ट नहीं है। हालांकि यह मेरे लिए नोड v8.1.3

+0

त्रुटि: "अप्रत्याशित टोकन नया" ?! मुझे नहीं लगता कि आप एक निर्माता में 'नया' का उपयोग कर सकते हैं, और इसे "रिटर्न प्रॉक्सी" भी पसंद नहीं है? –

+1

वाह ऐसा लगता है कि यह काम कर रहा है ?! अच्छा लगा। ऐसा लगता है कि रचनाकारों ने अन्य कोशिशों में नई प्रॉक्सी नहीं लौटाई, इसलिए इस उदाहरण के लिए धन्यवाद। –

+0

@MasterJames कोई चिंता नहीं। हां, यह मेरे लिए नोड v8.1.3 पर काम करता है। – hallaji

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