9

我是第一次做 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 继承所有值/方法,并让“新”以 PHP OO 方式表现得像我期望的那样?(我确信 JS 这样做的方式真的很奇怪,就好像我的大脑从大学里正确地为我服务一样 Java 在这方面就像 PHP 一样工作)

4

3 回答 3

10

基本上

TestObject2.prototype = new TestObject(); 

在 TestObject2 的原型链中放置一个 TestObject 实例。因此,TestObject2 的任何实例都将修改 TestObject 中相同的单个实例后代属性。如果您在 TestObject 的构造器中放置另一个 console.log,您会注意到它只被调用一次!

可以在此处找到有关您的确切问题的更多详细信息。

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

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

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

于 2010-10-18T15:50:52.257 回答
0

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

function TestObject2(data)
{
    this.clone_array = [];
    this.__construct(data);
    this.dothings = function()
    {
        this.dosomestuff();
    }
}
于 2010-10-18T13:35:19.783 回答
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;
于 2010-10-18T14:50:44.180 回答