2013-05-24 16 views
5

नीचे छोड़ा गया कोड त्रुटि TypeError: myObj.prototype is undefined त्रुटि देता है। क्या कोई मुझे समझा सकता है क्यों?यह जेएस कोड वैध क्यों नहीं है?

prototypenew Object() & ऑब्जेक्ट शब्दशः नीचे निर्दिष्ट अनुसार क्यों नहीं है?

var myObj = { 
    a : "This is a", 
    b : "This is b" 
} 

myObj.prototype.c= "This is c"; // TypeError: myObj.prototype is undefined 

यदि यह मान्य दृष्टिकोण नहीं है तो मैं इसे कैसे प्राप्त कर सकता हूं?

+5

यह सिर्फ 'myObj.c = "foo" होना चाहिए; ' – epascarello

+0

आप ऑब्जेक्ट.getPrototypeOf के साथ एक उदाहरण से प्रोटोटाइप प्राप्त कर सकते हैं: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/ऑब्जेक्ट/getPrototypeOf हालांकि इस मामले में आप शायद नहीं चाहते हैं। –

+0

[एलोक्वेंट जावास्क्रिप्ट] (http://eloquentjavascript.net/chapter8.html) पर एक नज़र डालें। –

उत्तर

10

एक्मास्क्रिप्ट के पुराने संस्करणों में आप सीधे वस्तुओं के प्रोटोटाइप तक नहीं पहुंच पाएंगे; prototype संपत्ति केवल फ़ंक्शंस पर मौजूद थी, और जब इसे कन्स्ट्रक्टर के रूप में उपयोग किया जाता है तो यह खेल में आता है। तो अगर आप ऐसा कर सकता है:

// This is the myObj constuctor 
function myObj() { 
    this.a = "This is a"; 
    this.b = "This is b"; 
} 

// Setting a property on the constructor prototype 
// All instances will share this 
myObj.prototype.c= "This is c"; 

// Creating a new object and testing its "c" property 
var obj = new myObj(); 
alert(obj.c); // "This is c" 

Modern browsersObject.getPrototypeOf लागू, जिसका अर्थ है आप यह कर सकते हैं:

var myObj = { 
    a : "This is a", 
    b : "This is b" 
} 

Object.getPrototypeOf(myObj).c= "This is c"; 

लेकिन, आप सावधान रहना होगा! यदि आप ऐसा करते हैं, तो सभी ऑब्जेक्ट्स जो अब मौजूद हैं और भविष्य में बनाए गए सभी ऑब्जेक्ट्स को उनके प्रोटोटाइप श्रृंखला के माध्यम से c संपत्ति का वारिस होगा!

इसका कारण यह है myObj प्रकार Object की है, और Object के प्रोटोटाइप सब कुछ किसी भी प्रकार का ऑब्जेक्ट है कि द्वारा विरासत में मिली है।

var myObj = { 
    a : "This is a", 
    b : "This is b" 
} 

Object.getPrototypeOf(myObj).c= "This is c"; 

var anotherObject = {}; 

alert(anotherObject.c); // "This is c" -- was it expected? 

See it in action: इस ओर जाता है।

+0

नहीं! "x.prototype" "एक्स का प्रोटोटाइप" नहीं है। – georg

+0

@ thg435: मुझे यकीन नहीं है कि मैं आपकी बात समझता हूं, क्या आप कृपया स्पष्टीकरण दे सकते हैं? – Jon

+0

निश्चित रूप से - जब आप जावास्क्रिप्ट में "someObj.prototype" लिखते हैं तो आप ऑब्जेक्ट के प्रोटोटाइप तक नहीं पहुंचते हैं। 'x.prototype' एक्स के वास्तविक प्रोटोटाइप से पूरी तरह से अलग है - यह सिर्फ एक भ्रमित नाम होता है। – georg

1

आप पहली बार इस तरह एक कस्टम वस्तु घोषित करना चाहिए:

function myObj(){ 
    this.a = "a"; 
    this.b = "b"; 
} 

तो आप के रूप में

myObj.prototype.c = "c"; 

इस प्रकार है कि वस्तु के लिए "सी" संपत्ति जोड़ सकते हैं जैसा कि आप यहाँ देख सकते हैं http://jsfiddle.net/gwaqm/ संपत्ति सी सफलतापूर्वक सेट किया गया है।

0

आप ग संपत्ति वस्तु निर्माण के बाद जोड़ना चाहते थे, तो आप

myObj.c = 'This is c'; 
0

वस्तुओं उनके निर्माता, नहीं अपने स्वयं के प्रोटोटाइप के प्रोटोटाइप के गुणों के वारिस कर सकते हैं।

आप myObj.constructor.prototype का उपयोग कर सकते हैं। लेकिन आपको ऐसा नहीं करना चाहिए क्योंकि ({})। कन्स्ट्रक्टर == ऑब्जेक्ट। तो आप उस ऑब्जेक्ट के प्रोटोटाइप को संशोधित करते हैं जिसे आप सभी ऑब्जेक्ट्स के प्रोटोटाइप को संशोधित करते हैं।

//New method 
var proto = ... 
var myObj = Object.create(proto); 

या

//Old method 
var proto = ... 
var constructor = function(){}; 
constructor.prototype = proto; 
var myObj = new constructor(); 

आप चाहिए नहीं उपयोग __proto__, क्योंकि यह बुरा डिजाइन और "गैर मानक" है:

एक विशिष्ट प्रोटोटाइप उपयोग के साथ एक वस्तु बनाने के लिए (https://developer.mozilla.org/de/docs/JavaScript/Reference/Global_Objects/Object देखें) आप ऑब्जेक्ट.getPrototypeOf (obj) का उपयोग कर सकते हैं हालांकि

0

आप prototype के माध्यम से किसी ऑब्जेक्ट के प्रोटोटाइप तक नहीं पहुंच सकते - यह केवल प्रोटोटाइप नामक एक संपत्ति होगी। आप __proto__ के माध्यम से प्रोटोटाइप यहां पहुंच सकता है

var myObj = { 
    a : "This is a", 
    b : "This is b" 
} 

myObj.__proto__.c= 3; 

var test = {}; 

test.c //-> yields 3 

सही (मानक अनुरूप) जिस तरह से हालांकि उपयोग करने के लिए किया जाएगा या तो (कोई ECMA-स्टैंडर्ड!):

Object.getPrototypeOf(myObj) 

या

myObj.constructor.prototype 
+0

मैं आपका उत्तर नहीं समझ सकता। confusing.not स्पष्ट – SivaRajini

+0

@ शिवा इसके बारे में क्या भ्रमित कर रहा है? – Christoph

0

आपके पहले उदाहरण में आपने ऑब्जेक्ट लिटल नोटेशन का इस्तेमाल ऑब्जेक्ट को दो गुणों के साथ परिभाषित करने के लिए किया था: a और b

prototypeconstructor ऑब्जेक्ट से संबंधित है। आप एक वस्तु के प्रोटोटाइप का उपयोग करना चाहते हैं, तो आपको पहले एक निर्माता समारोह के साथ शुरू:

function myClass(){ 
    this.a = "This is a"; 
} 

तो फिर तुम अपने प्रोटोटाइप का संदर्भ लें:

myClass.prototype.pa = "This is prototyped a"; 

इसलिए, सभी वस्तुओं है कि अंततः myClass का हिस्सा प्रोटोटाइप pa सदस्य का उत्तराधिकारी होगा।

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