我是第一次使用OO JavaScript。我已经阅读了有关继承和原型(prototype)的文章,并认为我已经破解了它。直到我发现了这个小例子。
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();
}
}
如果我执行以下操作:
var foo = new TestObject2([1,2,3,4]);
foo.dothings();
var bar = new TestObject2([4,5,6]);
bar.dothings();
我希望控制台显示:
Testing Object Values, []
Testing Object Values, []
但是它显示:
Testing Object Values, []
Testing Object Values, [1,2,3,4]
问题当然是这个调用:
TestObject2.prototype = new TestObject();
除了在__construct方法中手动重置变量外,如何使TestObject中的父变量“重置”?
TestObject2是否有另一种方法可以继承TestObject的所有值/方法,并使"new"行为以我期望的PHP OO方式运行? (我敢肯定,JS这样做的方式真的很奇怪,好像我的大脑在这方面像Java之类的大学Java一样正确地为我服务)
最佳答案
基本上
TestObject2.prototype = new TestObject();
在TestObject2的原型(prototype)链中放置一个TestObject实例。因此,TestObject2的任何实例都将修改TestObject中相同的单个实例后代属性。如果将另一个console.log放入TestObject的构造器中,您会注意到它仅被调用一次!
有关您的确切问题的更多详细信息,请参见here。
您需要像这样在TextObject2的构造函数中调用TextObject的构造函数:
function TestObject2(data)
{
TestObject.call( this, data);
this.__construct(data);
this.dothings = function()
{
this.dosomestuff();
}
}
通过调用TestObject构造函数并在(这是)新TestObject2对象的范围内执行它,它将在TestObject2对象中创建TestObject的所有元素。