2013-07-03 11 views
5

मैं बिना किसी भाग्य के प्रोटोटाइप ऑब्जेक्ट पर एक गैर-गणना योग्य toJSON फ़ंक्शन को परिभाषित करने का प्रयास कर रहा हूं। मैं ECMAScript 5 toJSON को कुछ इसी तरह के लिए उम्मीद कर रहा हूँ:जेएस गैर-संख्यात्मक फ़ंक्शन

Object.defineProperty(obj, prop, { enumerable: false }); 

हालांकि यह एक संपत्ति है जो एक विधि के रूप में पहुँचा नहीं जा सकता के रूप में यह परिभाषित करता है।

मैं, एक गैर गणनीय फैशन में समारोह को परिभाषित करने के रूप में मैं सभी आदिम प्रकार के प्रोटोटाइप में परिभाषित करने के लिए योजना बना रहा था सक्षम होने के लिए उम्मीद कर रही थी (String, Number, Boolean, Array, और Object), ताकि मैं जटिल वस्तुओं के माध्यम से समारोह को पुन: लागू कर सकते हैं।

अंतिम लक्ष्य यहां नेस्टेड संग्रहों के साथ एक बैकबोन मॉडल/संग्रह JSONify सक्षम करने में सक्षम होना है।

  1. यह एक प्रोटोटाइप पर एक गैर गणनीय समारोह को परिभाषित करना संभव है:

    मैं कुल में लगता है कि मैं दो मुख्य प्रश्न हैं? यदि हां, तो कैसे?

  2. क्या नेस्टेड बैकबोन मॉडल JSONify करने का कोई बेहतर तरीका है?
+0

परिभाषा द्वारा एक विधि * एक वस्तु की एक संपत्ति है। आप एक भेद तैयार कर रहे हैं जो अस्तित्व में नहीं है। यदि आप इसे गैर-गणना योग्य बनाना चाहते हैं, तो जाहिर है कि आप किसी ऑब्जेक्ट की गुणों का आकलन कर रहे हैं। –

+0

हां, हालांकि मैं इसे एक गैर-गणनीय संपत्ति बनाना चाहता हूं, वैसे ही ऑब्जेक्ट.डेफिनप्रोपर्टी गैर-गणना योग्य है। यानी, 'for (x in obj) ' –

+0

दाएं का उपयोग करते समय पुनरावृत्त नहीं किया जाता है। फिर, एक विधि एक वस्तु की एक संपत्ति है जो एक समारोह का संदर्भ देती है। आपके पास जो कोड है वह वह है जो आप संपत्ति को गैर-गणना करने के लिए उपयोग करेंगे। –

उत्तर

13

मुझे यह नहीं मिला, आप इसे विधि के रूप में क्यों नहीं पहुंच सकते?

var foo = {}; 

Object.defineProperty(foo, 'bar', { 
    enumerable: false, 
    value: function() {console.log('foo.bar\'d!');} 
}); 

foo.bar(); // foo.bar'd! 

यदि आप प्रोटोटाइप पर यह चाहते थे, यह उतना आसान

रूप
Object.defineProperty(foo.prototype, /* etc */); 

या Object.create

foo.prototype = Object.create(null, { 
    'bar': {value: function() {/* ... */}} 
}); 

में भी सीधे हालांकि, जब तक आप foo के उदाहरण बना रहे हैं, यह दिखाएगा यदि आप foo.bar पर आज़माएं, और केवल foo.prototype.bar के रूप में दिखाई दे।

तो foo उसके अपने प्रोटोटाइप (जैसे foo = Object.create({})) है, तो आप इसे Object.getPrototypeOf साथ, प्राप्त करने के लिए है कि संपत्ति जोड़ने और फिर foo.bar काम करेगा, भले ही यह एक उदाहरण नहीं है सकते हैं।

var proto = Object.getPrototypeOf(foo); // get prototype 
Object.defineProperty(proto, /* etc */); 

आप visibility of enumerable vs non-enumerable properties here देख सकते हैं।

+0

बहुत बढ़िया, धन्यवाद!समस्या यह थी कि मैं 'मूल्य' के बजाय' get' का उपयोग कर रहा था, जिसे मैं फ़ंक्शन के रूप में एक्सेस करने में सक्षम नहीं था। –

+0

_get_ किसी भी तर्क को पार किए बिना _function_ को आमंत्रित करता है, फिर यह दिखाता है कि संपत्ति फ़ंक्शन के 'रिटर्न' के बराबर है, इसलिए आप 'SJON (args)' –

+0

ठीक करना चाहते थे 'तो आप' SJON() (args) 'कर रहे थे । यदि आपको कोई फर्क नहीं पड़ता तो एक आखिरी सवाल; क्या यह दृष्टिकोण एक समान कार्य के साथ ऑब्जेक्ट प्रोटोटाइप को विस्तारित करने के समान मुद्दों में से कुछ का कारण बन जाएगा? –

1

पॉल एस स्थापित करने के लिए की आवश्यकता होगी, के बारे में सही है संपत्ति परिभाषा के एक get के बजाय value, लेकिन मैं जोड़ने के लिए है कि आप, क्योंकि झूठे Object.defineProperty() जवाब कर सकते हैं कि विकल्प के लिए डिफ़ॉल्ट है enumerable: false पारित करने के लिए की जरूरत नहीं है चाहता था सरलीकृत:

var foo = {};  

Object.defineProperty(foo, 'bar', { 
    value: function(){ console.log('calling bar!'); } 
}); 

foo.bar(); 
+0

धन्यवाद, मैंने इसे स्पष्ट रूप से प्रश्न में स्पष्ट करने के लिए इसे शामिल किया है, लेकिन यह एक अच्छा नोट है कि इसकी वास्तव में आवश्यकता नहीं है। –

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