दिलचस्प पोस्ट
पॉइंटर के माध्यम से सी और सी ++ में फ़ंक्शन से स्थानीय डेटा रिटर्न करना SQLServer समयबाह्य अपवाद कैसे प्राप्त करें I कहाँ त्रुटि CS0433 "प्रकार 'एक्स' दोनों पहले से ही दोनों में मौजूद है A.dll और B.dll" से आए हैं? प्रोसेसिबिलर के साथ कार्य निर्देशिका कैसे सेट करें CUDA ग्रिड आयामों को समझना, ब्लॉक आयाम और थ्रेड संगठन (सरल विवरण) 'बोने' का मतलब क्या है? क्या ऐंजरीआरजेएस को आंशिक रूप से शुरू करने के लिए कोई रास्ता नहीं है और जब आवश्यक हो? डेटाफ्रेम में शब्दकोशों की सूची परिवर्तित करें आरटीएफ स्ट्रिंग से पाठ निकालने के लिए नियमित अभिव्यक्ति क्या रंग मिश्रण के लिए एक एल्गोरिथ्म है जो असली रंगों को मिलाकर काम करता है? स्विफ्ट का उपयोग करते हुए एक JSON फ़ाइल में पढ़ना GCM संदेशों को प्राप्त करें, भले ही ऐप बंद हो जाता है (स्लाइड / स्वाइप दूर) नियमित अभिव्यक्ति: संख्यात्मक श्रेणी SFINAE वापसी प्रकार में काम कर रहा है लेकिन टेम्पलेट पैरामीटर के रूप में नहीं शैल स्क्रिप्ट एन दिन से पुराने निर्देशिका को हटाने के लिए

जावास्क्रिप्ट ऑब्जेक्ट सदस्य हैं जो प्रोटोटाइप हैं क्योंकि एरेज सभी क्लास इंस्टेंसेस द्वारा साझा किए जाते हैं

क्या किसीने इस व्यवहार को पहले देखा है? यह वास्तव में मुझे फेंक दिया … मुझे उम्मीद थी कि सभी क्लास इंस्टेंस के बीच साझा किए जाने के बजाय प्रत्येक क्लास इंस्टेंस के लिए प्रोटोटाइप एरेज़ निजी होना चाहिए।

क्या कोई यह सत्यापित करता है कि यह सही व्यवहार है और शायद इस व्यवहार को और अधिक विस्तार से समझाएं?

टिप्पणी की गई कोड को नोटिस करें और यह स्क्रिप्ट के व्यवहार को कैसे प्रभावित करता है।

<html> <head> <script type="text/javascript"> function print_r( title, object ) { var output = ''; for( var key in object ) { output += key + ": " + object[ key ] + "\n"; } output = title + "\n\n" + output; alert( output ); } function Sandwich() { // Uncomment this to fix the problem //this.ingredients = []; } Sandwich.prototype = { "ingredients" : [], "addIngredients" : function( ingArray ) { for( var key in ingArray ) { this.addIngredient( ingArray[ key ] ); } }, "addIngredient" : function( thing ) { this.ingredients.push( thing ); } } var cheeseburger = new Sandwich(); cheeseburger.addIngredients( [ "burger", "cheese" ] ); var blt = new Sandwich(); blt.addIngredients( [ "bacon", "lettuce", "tomato" ] ); var spicy_chicken_sandwich = new Sandwich(); spicy_chicken_sandwich.addIngredients( [ "spicy chicken pattie", "lettuce", "tomato", "honey dijon mayo", "love" ] ); var onLoad = function() { print_r( "Cheeseburger contains:", cheeseburger.ingredients ); }; </script> </head> <body onload="onLoad();"> </body> </html> 

बहुत धन्यवाद।

वेब के समाधान से एकत्रित समाधान "जावास्क्रिप्ट ऑब्जेक्ट सदस्य हैं जो प्रोटोटाइप हैं क्योंकि एरेज सभी क्लास इंस्टेंसेस द्वारा साझा किए जाते हैं"

किसी वस्तु का प्रोटोटाइप सिर्फ एक वस्तु है प्रोटोटाइप के गुणों को उस ऑब्जेक्ट से प्राप्त होने वाले सभी ऑब्जेक्ट्स के बीच साझा किया जाता है। संपत्तियों की कोई प्रतियां नहीं बनती हैं यदि आप "क्लास" के एक नए उदाहरण बनाते हैं (कक्षाएं जेएस में किसी भी तरह से मौजूद नहीं हैं), यानी एक वस्तु जो प्रोटोटाइप से प्राप्त होती है।

यह केवल इन विरासत गुणों का उपयोग कैसे करता है पर एक फर्क पड़ता है:

 function Foo() {} Foo.prototype = { array: [], func: function() {} } a = new Foo(); b = new Foo(); a.array.push('bar'); console.log(b.array); // prints ["bar"] b.func.bar = 'baz'; console.log(a.func.bar); // prints baz 

इन सभी मामलों में आप हमेशा एक ही ऑब्जेक्ट के साथ काम कर रहे हैं।

लेकिन अगर आप ऑब्जेक्ट की संपत्ति के लिए एक मान निर्दिष्ट करते हैं, तो संपत्ति स्वतः ही वस्तु पर सेट / बनाई जाएगी, इसका प्रोटोटाइप नहीं, और इसलिए साझा नहीं किया जाएगा:

 console.log(a.hasOwnProperty('array')); // prints false console.log(a.array); // prints ["bar"] a.array = ['foo']; console.log(a.hasOwnProperty('array')); // prints true console.log(a.array); // prints ["foo"] console.log(b.array); // prints ["bar"] 

यदि आप प्रत्येक आवृत्ति के लिए खुद का ऑरेंज बनाना चाहते हैं, तो आपको इसे कन्स्ट्रक्टर में परिभाषित करना होगा:

 function Foo() { this.array = []; } 

क्योंकि यहां, this new ऑब्जेक्ट को संदर्भित करता है जो आपको new Foo() कॉल करते समय उत्पन्न होता है।

अंगूठे का नियम है: उदाहरण- विशिष्ट डेटा को कंसट्रक्टर के अंदर उदाहरण के लिए सौंपा जाना चाहिए, प्रोटोटाइप को साझा डेटा (विधियों जैसे) निर्दिष्ट करना चाहिए।


आप ऑब्जेक्ट मॉडल का विवरण पढ़ सकते हैं, जो क्लास-आधारित बनाम प्रोटोटाइप-आधारित भाषाओं और कैसे ऑब्जेक्ट वास्तव में काम करते हैं के बीच अंतर का वर्णन करता है।

अद्यतन करें:

आप किसी ऑब्जेक्ट के प्रोटोटाइप को ऑब्जेक्ट के माध्यम से एक्सेस कर सकते हैं। Object.getPrototypeOf(obj) (बहुत पुराने ब्राउज़र में काम नहीं कर सकते हैं), और Object.getPrototypeOf(a) === Object.getPrototypeOf(b) आपको true देता true । यह वही वस्तु है, जिसे Foo.prototype रूप में भी जाना जाता है।

व्यवहार सही है। [] रनटाइम में new Array() को ट्रांलिलेट किया जाता है, लेकिन केवल एक ऐसी सरणी का निर्माण होता है

दूसरे शब्दों में, Obj.prototype = {...} किसी भी अन्य Obj.prototype = {...} तरह निष्पादित होता है।

जब आप var exp1 = new C() , तो जावास्क्रिप्ट सेट exp1.[[Prototype]] = C.prototype जब आप तब उदाहरण के गुणों का उपयोग करते हैं, तो जावास्क्रिप्ट पहले यह जांचता है कि क्या वे सीधे उस ऑब्जेक्ट पर मौजूद हैं, और यदि नहीं, तो यह [[Prototype]] में दिखता है। इसका अर्थ है कि आप जो प्रोटोटाइप परिभाषित करते हैं, वह सभी उदाहरणों से प्रभावी रूप से साझा किया जाता है, और आप बाद में प्रोटोटाइप के कुछ हिस्सों को बदल सकते हैं और सभी मौजूदा उदाहरणों में परिवर्तन दिखाई देते हैं।