2010-10-18 15 views
9

में चर, मैं पहली बार ओओ जावास्क्रिप्ट कर रहा हूं। मैंने विरासत और प्रोटोटाइप के बारे में पढ़ा है और सोचा है कि मैंने इसे तोड़ दिया था। जब तक मैंने इस छोटे से उदाहरण की खोज नहीं की।जावास्क्रिप्ट में विरासत, "पैरेंट"

function TestObject(data) 
{ 
    this.test_array = []; 
    this.clone_array = []; 

    this.dosomestuff = function() 
    { 
     for(var i=0; i<this.test_array.length; i++) 
     { 
      this.clone_array[i]=this.test_array[i]; 
     } 
    } 

    this.__construct = function(data) 
    { 
     console.log("Testing Object Values" ,this.clone_array); 
     this.test_array = data; 
    }; 
} 

TestObject2.prototype = new TestObject(); 

function TestObject2(data) 
{ 
    this.__construct(data); 
    this.dothings = function() 
    { 
     this.dosomestuff(); 
    } 
} 

अगर मैं निम्न कार्य करें:

Testing Object Values, [] 
Testing Object Values, [] 

हालांकि यह पता चलता है:

Testing Object Values, [] 
Testing Object Values, [1,2,3,4] 

की समस्या है

var foo = new TestObject2([1,2,3,4]); 
foo.dothings(); 
var bar = new TestObject2([4,5,6]); 
bar.dothings(); 

मैं कंसोल दिखाने के लिए उम्मीद करेंगे पाठ्यक्रम यह कॉल:

TestObject2.prototype = new TestObject(); 

मैं टेस्टऑब्जेक्ट में मूलभूत चर को __construct विधि में मैन्युअल रूप से रीसेट करने के अलावा "रीसेट" करने के लिए कैसे प्राप्त करूं?

क्या टेस्टऑब्जेक्ट से सभी मूल्यों/विधियों को विरासत में लाने के लिए TestObject2 का एक और तरीका है और "नया" व्यवहार करने के लिए जैसा कि मैं एक PHP ओओ तरीके से अपेक्षा करता हूं? (मुझे यकीन है कि जेएस ऐसा कर रहा है, वास्तव में वास्तव में अजीब है जैसे कि मेरा दिमाग मुझे विश्वविद्यालय जावा से सही तरीके से सेवा करता है जैसे इस संबंध में PHP)

+0

डेमो यहां: http://jsbin.com/olino3 – johnwards

उत्तर

10

मूल रूप से

TestObject2.prototype = new TestObject(); 

स्थानों TestObject का एक उदाहरण TestObject2 के प्रोटोटाइप श्रृंखला में की कोशिश करो। इस प्रकार, TestObject2 के किसी भी उदाहरण TestObject में एक ही एकल उदाहरण संतान संपत्ति को संशोधित करेगा। यदि आप TestObject के कंस्ट्रूटर में एक और console.log डालते हैं तो आप इसे केवल एक बार बुलाएंगे!

आपकी सटीक समस्या के बारे में अधिक जानकारी here मिल सकती है। ,

function TestObject2(data) 
{ 
    TestObject.call(this, data); 
    this.__construct(data); 
    this.dothings = function() 
    { 
     this.dosomestuff(); 
    } 
} 

TestObject निर्माता कार्यप्रणाली को कॉल और के दायरे में यह क्रियान्वित (यह है) नई TestObject2 वस्तु द्वारा:

आप इस तरह TextObject2 के निर्माता के भीतर से TextObject के निर्माता कॉल करने की आवश्यकता यह TestObject2 ऑब्जेक्ट में TestObject के सभी तत्व बनाता है।

+0

बढ़िया, ठीक वही जो मैं खोज रहा था। एक वोट भी है! – johnwards

+0

दोह, विरासत में शामिल कन्स्ट्रक्टर में कॉल के बारे में भूल गए। अच्छी नज़र। – JoshNaro

0

क्या आपने पहले से ही this.clone_array = []; को TestObject2 में परिभाषित करने का प्रयास किया है?

function TestObject2(data) 
{ 
    this.clone_array = []; 
    this.__construct(data); 
    this.dothings = function() 
    { 
     this.dosomestuff(); 
    } 
} 
+0

मेरे माता-पिता में 30 चर हैं। मैं माता-पिता को 3 अलग-अलग वर्गों में विस्तारित कर रहा हूं। मुझे इन 30 वर्गों में रीसेट को कॉपी और पेस्ट करना होगा। बुरा। मैं उन्हें रीसेट में डालने से बेहतर होगा। – johnwards

0

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

TestObject2.prototype = new TestObject(); 

TestObject2 के निर्माता अधिभावी है।

function TestObject2(data) 
{ 
    TestObject.call(this, data); 
    this.__construct(data); 
    this.dothings = function() 
    { 
     this.dosomestuff(); 
    } 
} 


TestObject2.prototype = new TestObject(); 
TestObject2.prototype.constructor = TestObject2; 
+0

कोई फर्क नहीं पड़ता। देखें: http://jsbin.com/olino3/3 – johnwards

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