prototypal inheritance - Javascript extend from constructor -


चलिए कहते हैं मेरे पास यह है:

  फ़ंक्शन फ़ू () {this.name = " fooos "; };   

अब स्क्रिप्ट में मेरे पास Foo का संदर्भ है, और तत्काल मुताबिक फू को गुण जोड़ने के लिए क्या करना है मैं ऐसा कुछ कर सकता हूं:

  Foo.prototype.myProp = 3; Foo = नया Foo (); उम्मीद (foo) .to.have.property ( 'नाम'); उम्मीद (foo) .to.have.property ( 'myProp');   

जब तक मुझे कोई ऑब्जेक्ट प्रोटोटाइप के साथ संलग्न करने की आवश्यकता न हो, तब तक यह बहुत अच्छा काम करता है:

  Foo.prototype.myProp = {bar: 3};   

मुद्दा यह है कि अब उदाहरणों को बार पर राज्य साझा किया जाएगा (जैसा कि बार केवल एक संदर्भ है):

  foo = नया फू (); Foo2 = नया फू (); Foo.myProp.bar = 5; उम्मीद (foo2.myProp.bar) .to.equal (5);   

जो वांछनीय नहीं है हालांकि यदि वस्तु निर्माता के अंदर जोड़ दी जाती है तो उदाहरण राज्यों को साझा नहीं करते हैं।

क्या इस के आस पास कोई रास्ता है? मेरे पास कंस्ट्रक्टर का उपयोग करने के लिए इसका उपयोग नहीं है। मुझे प्रोटोटाइप से किसी वस्तु को एक वस्तु संलग्न करने की आवश्यकता है। गुणों को प्रोटोटाइप पर नहीं होना चाहिए, आप उन्हें सीधे उदाहरणों में जोड़ सकते हैं:

P>

  var f = new Foo (); F.myProp = {बार: 3};   

मुझे पता है कि इसकी मैं क्या नहीं चाहता।

एकमात्र तरीका मैं इसे एक गुण के साथ प्रोटोटाइप के माध्यम से करने का विचार कर सकता हूं (कोई विधि नहीं; विधि का उपयोग कर रहा है) एक बदसूरत हैक है जहां आप प्रोटोटाइप पर संपत्ति को Object.defineProperty (केवल ES5-) के साथ परिभाषित करते हैं और फिर इसे फिर से परिभाषित करते हैं इसे पहली पहुंच पर, जैसे:

  ऑब्जेक्ट। डेफ़िनप्रॉपर्टी (Foo.prototype, "myProp", {get: function () {var obj = {बार: 3}; ऑब्जेक्ट। डेफ़िनप्रॉपर्टी (यह, "माइपरप्रोफ़", {get: function () {वापसी obj;}, सेट: फ़ंक्शन (मान) {obj = value;}}); वापसी obj;}});   

|

मैं यह नहीं सुझाता हूं। : -)


एक विकल्प Foo के सामने मुखौटा फेंकना होगा, जैसे:

  var OriginalFoo = Foo ; Foo = function () {OriginalFoo.apply (यह, तर्क); This.myProp = {बार: 3}; }; Foo.prototype = ऑब्जेक्ट। बनाएं (मूलफ़ू .प्रोटोटाइप);   

यह, निश्चित रूप से, केवल new Foo के बाद द्वारा निष्पादित वस्तुओं पर लागू होता है। यह कोड निष्पादित होता है।

Comments

Popular posts from this blog

sonata admin - how to add ManyToOne property field in configureListfield in sonataAdmin -

wpf - ControlTemplate with changes for every class -

python - how we can use ajax() in views.py in django? -