2010-08-10 12 views
7

मेरे पास कुछ ऑब्जेक्ट है, son कहें, जिसे मैं किसी अन्य ऑब्जेक्ट father से प्राप्त करना चाहता हूं।ऑब्जेक्ट के लिए प्रोटोटाइप जोड़ना शाब्दिक

बेशक मैं पिता के लिए एक निर्माता समारोह बना सकते हैं, जैसे

Father = function() { 
    this.firstProperty = someValue; 
    this.secondProperty = someOtherValue; 
} 

और फिर

var son = new Father(); 
son.thirdProperty = yetAnotherValue; 

का उपयोग, लेकिन यह वास्तव में नहीं है कि मैं क्या चाहता हूँ। चूंकि son में कई गुण होने जा रहे हैं, इसलिए यह बेटा को ऑब्जेक्ट के रूप में घोषित करने के लिए और अधिक पठनीय होगा। लेकिन तब मुझे नहीं पता कि इसका प्रोटोटाइप कैसे सेट करें।

तरह

var father = { 
    firstProperty: someValue; 
    secondProperty: someOtherValue; 
}; 
var son = { 
    thirdProperty: yetAnotherValue 
}; 
son.constructor.prototype = father; 

कुछ कर काम नहीं करेगा, के रूप में प्रोटोटाइप श्रृंखला छिपाना चाहता है और constructor.prototype के परिवर्तन के बारे में परवाह नहीं लगता है।

मुझे लगता है कि मैं की तरह

var father = { 
    firstProperty: someValue; 
    secondProperty: someOtherValue; 
}; 
var son = { 
    thirdProperty: yetAnotherValue 
    __proto__: father 
}; 
son.constructor.prototype = father; 

, Firefox में __proto__ संपत्ति का उपयोग कर सकते हैं लेकिन, जहाँ तक मैं समझता हूँ, इस भाषा के एक मानक सुविधा नहीं है और यह इसे सीधे उपयोग करने के लिए बेहतर नहीं है।

क्या ऑब्जेक्ट के लिए प्रोटोटाइप निर्दिष्ट करने का कोई तरीका है?

+0

http://stackoverflow.com/questions/1592384/adding-prototype-to-object-literal –

उत्तर

11

आप कर रहे हैं ठीक है, __proto__ है एक गैर मानक संपत्ति, और केवल दो मानक तरीकों से आप एक नई वस्तु की [[Prototype]], सेट करने के लिए कर रहे हैं:

  • new एक निर्माता के उपयोग और के माध्यम से ऑपरेटर (जैसा कि आप पहले से ही उल्लेख करते हैं)।
  • ईसीएमएस्क्रिप्ट 5 Object.create विधि का उपयोग करना।

Object.create अभी तक नहीं widely supported है (पर IE9Pre3 +, फ़ायरफ़ॉक्स 3.7Alpha +, क्रोम 5 + 5 + सफारी, राइनो 1.7 काम करता है), लेकिन कुछ बिंदु पर सभी कार्यान्वयन ES5 कल्पना अनुरूप होगा।

यह दो तर्क ले सकता है, पहला ऐसा ऑब्जेक्ट है जिसका उपयोग नई वस्तु के [[Prototype]] के रूप में किया जाएगा, और दूसरा, एक और ऑब्जेक्ट है जहां स्वयं के गुणों का वर्णन किया जा सकता है (उसी संरचना में Object.defineProperties का उपयोग करेगा)।

उदाहरण के लिए:

var father = { 
    firstProperty: 1, 
    secondProperty: 2 
}; 

var son = Object.create(father, { 
    thirdProperty: { 
    value: 'foo' 
    } 
}); 

father.isPrototypeOf(son); // true 
son.firstProperty; // 1 

son आंतरिक [[Prototype]] संपत्ति father का उल्लेख है, और यह एक मूल्य के संपत्ति thirdProperty नामित शामिल होंगे।

+1

आपका उत्तर मेरे सभी संदेहों को साफ़ करता है, लेकिन दुख की बात है कि ऑब्जेक्ट.क्रेट के लिए वाक्यविन्यास (जोड़ा गया "मान:") लगता है यहां तक ​​कि कम पठनीय भी। – Andrea

+1

हां, वे ऐसा फ़ंक्शन क्यों नहीं बना सकते थे जो किसी ऑब्जेक्ट को शाब्दिक रूप से स्वीकार करता हो। मेरा मतलब है, ज्यादातर समय हम केवल चाबियों और मूल्यों की परवाह करेंगे, न कि संपत्ति मेटाडेटा इसे केवल पढ़ने के लिए। –

-1

ऑब्जेक्ट शाब्दिक के लिए प्रोटोटाइप निर्दिष्ट करना थोड़ा "winky" है, क्योंकि आप मुख्य रूप से कन्स्ट्रक्टर सिंटैक्स (उदा।, नया एक्स()) का उपयोग करके बनाए गए ऑब्जेक्ट्स पर प्रोटोटाइप चाहते हैं। यह नहीं कह रहा कि यह संभव नहीं है ... लेकिन यह अजीब बात है। एक समान पैटर्न जो अच्छी तरह से साबित होता है (उदाहरण के लिए, jQuery द्वारा उपयोग किया जाता है), बजाय प्रोटोटाइप को ऑब्जेक्ट शाब्दिक के रूप में परिभाषित करना है।उदाहरण के लिए:

var X = function() {}; 
X.prototype = { 
    protoFunc1: function() {}, 
    protoFunc2: function() {} 
}; 
2

यह गलत jmar777 है। उदाहरण के लिए आप

var X = function() {}; 
X.prototype = { 
    protoFunc1: function() { console.log('p1');}, 
    protoFunc2: function() { console.log('p2');} 
}; 

X.protoFunc1(); // is not a function 

है, तो इसका मतलब है कि आप क्या कर रहे:

X.prototype = {} 

सिर्फ एक वस्तु प्रोटोटाइप कहा जाता है पैदा कर रही है। वास्तविक प्रोटोटाइप नहीं। प्रोटोटाइप का उपयोग करने के लिए आपको कन्स्ट्रक्टर फ़ंक्शंस का उपयोग करना होगा।

अगर फिर भी आप इसे इस (निर्माता विधि) को संशोधित

function X(){}; 
X.prototype.protoFunc1 = function() { 
    console.log('p1'); 
} 
X.prototype.protoFunc2 = function() { 
    console.log('p2'); 
} 

var x = new X(); 
x.protoFunc1(); //'p1' 

यह काम करेगा।

या तो प्रोटोटाइप का उपयोग किए बिना वस्तु शाब्दिक विधि जाना या प्रोटोटाइप का उपयोग कर contructor विधि का उपयोग करें।

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