2013-03-07 10 views
6

जावास्क्रिप्ट में, ऐसा कहा जाता है कि ऑब्जेक्ट लिटरल में प्रोटोटाइप लिंकिंग है, लेकिन फ़ंक्शन ऑब्जेक्ट्स में प्रोटोटाइप लिंकिंग और प्रोटोटाइप प्रॉपर्टी दोनों हैं।जावास्क्रिप्ट विरासत और ऑब्जेक्ट लिटल

तो, उपर्युक्त के आधार पर, क्या कोई कह सकता है कि विरासत (जो प्रोटोटाइप संपत्ति का उपयोग करती है), केवल कार्य वस्तुओं (कन्स्ट्रक्टर संस्करण) के साथ संभव है और ऑब्जेक्ट अक्षर के साथ नहीं है?

इसके अलावा, जोड़ने के लिए, __proto__ संपत्ति सभी ब्राउज़रों में सुलभ नहीं है ...

+1

आप किसी मौजूदा ऑब्जेक्ट के प्रोटोटाइप को बदल सकते हैं नहीं या जब एक वस्तु शाब्दिक का उपयोग कर प्रोटोटाइप निर्दिष्ट करते हैं, तो, अगर मैं आपके सवाल का सही ढंग से समझ, मैं हाँ कहेंगे। –

+0

तो यह अधिकांश ब्राउज़र व्यवहार को संदर्भित करेगा (फ़ायरफ़ॉक्स जैसे कुछ को छोड़कर जो "__proto__" लिंकिंग को सेट करने की अनुमति देता है) ... तो क्या कोई कह सकता है कि विरासत ऑब्जेक्ट शाब्दिक का उपयोग करके कार्यान्वित किया जा सकता है (लेकिन केवल ब्राउज़र में जो __proto__ को सेट करने की अनुमति देता है लिंक, फ़ायरफ़ॉक्स की तरह)? – testndtv

+0

ऑब्जेक्ट लिटलल्स स्वयं 'ऑब्जेक्ट.प्रोटोटाइप' से प्राप्त होते हैं, इसलिए आपको अभी भी विरासत मिल रही है, लेकिन आप वर्तमान में रचनाकारों के साथ शाब्दिक वाक्यविन्यास का उपयोग करते समय उस समय से अधिक प्रोटोटाइप श्रृंखला स्थापित नहीं कर सकते हैं। और रचनाकार एकमात्र रास्ता नहीं हैं। आप इसके बजाय 'Object.create' का उपयोग कर सकते हैं। –

उत्तर

2

लघु संस्करण:

हाँ: प्रोटोटाइप श्रृंखला की स्थापना नहीं की जा सकती या संशोधित करने के लिए एक बताए द्वारा ऑब्जेक्ट की prototype संपत्ति। आप एक वस्तु को शाब्दिक वस्तु के साथ बनाकर विरासत स्थापित नहीं कर सकते हैं और फिर इसे prototype नामक एक संपत्ति दे सकते हैं। इस तरह की संपत्ति को prototype कहा जाएगा, लेकिन प्रोटोटाइप विरासत के लिए विचार नहीं किया जाएगा।

लंबे समय तक:

आप एक संपत्ति है कि है undefined, उस वस्तु की विरासत श्रृंखला चेक किया गया है का उपयोग करते हैं। इसलिए, यदि obj['prop']undefined है, तो obj.prototype['prop'] चेक किया जाएगा। कई ब्राउज़रों में, prototype संपत्ति आंतरिक रूप से __proto__ संपत्ति के रूप में कार्यान्वित की जाती है, लेकिन यह बिंदु के अलावा है। इसके बजाय, बिंदु यह है कि अगर कुछ संपत्ति undefined है, तो उस संपत्ति के लिए ऑब्जेक्ट का प्रोटोटाइप चेक किया गया है।

के रूप में लोगों को टिप्पणी में कहा है, यह एक प्रोटोटाइप है कि एक समारोह के prototype संपत्ति के लिए उस वस्तु बताए और फिर एक निर्माता के रूप में है कि फ़ंक्शन का उपयोग करके ऊपर-वर्णित विरासत प्रदान करता है के साथ एक वस्तु प्रदान करने ही संभव है।

लेकिन, prototype कन्स्ट्रक्टर इनोकेशन द्वारा उत्पादित किसी ऑब्जेक्ट की संपत्ति object.hasOwnProperty('prototype') नहीं है। दूसरी तरफ, यदि आप किसी ऑब्जेक्ट में prototype प्रॉपर्टी असाइन करते हैं, तो वह ऑब्जेक्ट object.hasOwnProperty('prototype') होगा, लेकिन फिर object.prototype प्रोटोटाइप श्रृंखला से कोई लेना-देना नहीं होगा-यह केवल एक नियमित संपत्ति होगी, और prototype पर कॉल करने के लिए किया जाएगा ।

इस प्रदर्शन करने के लिए:

var foo = {}; 
foo.prototype = {bar: 'hello'}; 
console.log(foo.bar); // undefined 
console.log(foo.prototype); // Object {bar: "hello"} 
console.log(foo.hasOwnProperty('prototype')); // true 

var Foo = function() {}; 
Foo.prototype = {bar: 'hello'}; 
var f = new Foo; 
console.log(f.bar); // 'hello'; 
console.log(f.hasOwnProperty('bar')); // false 
console.log(f.prototype); // undefined 
console.log(f.hasOwnProperty('prototype')); // false 
संबंधित मुद्दे