javascript中的继承,“父”中的变量

时间:2010-10-18 13:06:57

标签: javascript inheritance prototypal-inheritance

我第一次做OO javascript。我已经阅读了有关继承和原型的内容,并认为我已经破解了它。直到我发现这个小例子。

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中正确地为我提供了像PHP这样的工作)

3 个答案:

答案 0 :(得分:10)

基本上

TestObject2.prototype = new TestObject(); 

将TestObject的单个实例放在TestObject2的原型链中。因此,TestObject2的任何实例都将修改TestObject中的相同单实例后代属性。如果你在TestObject的construtor中放入另一个console.log,你会发现它只被调用一次!

可以找到有关您确切问题的更多详细信息here

您需要在TextObject2的构造函数中调用TextObject的构造函数,如下所示:

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

通过调用TestObject构造函数并在(这是)新的TestObject2对象的范围内执行它,它将在TestObject2对象中创建TestObject的所有元素。

答案 1 :(得分:0)

您是否已尝试将this.clone_array = [];定义到TestObject2中?

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

答案 2 :(得分: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;