2010-10-18 6 views
9

değişkenler ilk kez OO javascript yapıyorum. Miras ve prototip hakkında okudum ve onu kırdığımı düşündüm. Bu küçük örneği keşfedene kadar.Kalıtım, "ebeveyn"

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(); 
    } 
} 

aşağıdaki yaparsanız:

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

gösterir Ancak: Sorun taşımaktadır

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(); 

Ben konsol göstermek beklenir Tabii bu çağrı:

TestObject2.prototype = new TestObject(); 

TestObject öğesindeki üst değişkenleri, el ile __construct yönteminde sıfırlama dışında "sıfırlamak" için nasıl alabilirim?

testObject tüm değerler/yöntemleri devralma TestObject2 ve ben bir PHP OO şekilde beklediğiniz gibi "yeni" davranması için başka bir yolu var mı? (JS'nin bunu yapmasının, beynimin bana doğru bir şekilde hizmet verdiği gibi, PHP'nin bu şekilde PHP gibi doğru bir şekilde çalışıp çalışmadığı gibi) gerçekten çok garip olduğunu düşünüyorum.

+0

Demo: http://jsbin.com/olino3 – johnwards

cevap

10

TestObject2 prototip zincirinde Temelde

TestObject2.prototype = new TestObject(); 

yerler testObject tek bir örneğini deneyin. Bu nedenle, TestObject2'nin herhangi bir örneği, TestObject öğesindeki aynı tek örnek yavru özelliğini değiştirir. TestObject'in yapıcısına başka bir konsol.log eklerseniz, sadece bir kez çağrıldığını görürsünüz! tam sorununa

fazla detay here bulunabilir.

Böyle TextObject2 yapıcısı içinden TextObject yapıcısı çağırmak gerekir:

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

(bu) yeni TestObject2 nesnesi TestObject yapıcı işlevini çağırarak ve kapsamı içinde yürüterek, TestObject2 nesnesinde tüm TestObject öğelerini oluşturur. Burada

+0

Mükemmel, tam olarak aradığım şey. Bir de oy ver! – johnwards

+0

Doh, devralınan yapıcıya yapılan çağrıyı unuttu. Güzel göz. – JoshNaro

0

TestObject2 yerine this.clone_array = []; tanımlamayı denediniz mi?

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

benim üst 30 değişkenler var. Ebeveynleri 3 farklı sınıfta genişletiyorum. Sıfırlamayı bu 30 sınıfa kopyalayıp yapıştırmam gerekiyor. Pis. Onları sıfırlamaya koymaktan daha iyi olurdum. – johnwards

0

Ben

TestObject2.prototype = new TestObject(); 

TestObject2 yapıcısı geçersiz olduğunu düşünüyorum.

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


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

Hiçbir fark yok. Bakınız: http://jsbin.com/olino3/3 – johnwards