Наследование в JavaScript, переменные в «родителе» - PullRequest
9 голосов
/ 18 октября 2010

Я делаю 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();

Как заставить родительские переменные в TestObject «сбрасывать», кроме как вручную сбрасывать их в методе __construct?

Есть ли другой способ TestObject2 унаследовать все значения / методы от TestObject и заставить «new» вести себя так, как я ожидал бы в PHP OO? (Я уверен, что способ, которым JS делает это, действительно очень странный, как будто мой мозг правильно обслуживает меня из университета. В этом отношении Java работает как PHP) *

Ответы [ 3 ]

10 голосов
/ 18 октября 2010

В основном

TestObject2.prototype = new TestObject(); 

помещает один экземпляр TestObject в цепочку прототипов TestObject2. Таким образом, любые экземпляры TestObject2 будут изменять одно и то же свойство потомка одного экземпляра в TestObject. Если вы добавите еще один файл console.log в конструктор TestObject, вы заметите, что он вызывается только один раз!

Более подробную информацию о вашей конкретной проблеме можно найти здесь .

Вам нужно вызвать конструктор TextObject из конструктора TextObject2 следующим образом:

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

Вызывая функцию конструктора TestObject и выполняя ее в области (это) нового объекта TestObject2, он создает все элементы TestObject в объекте TestObject2.

0 голосов
/ 18 октября 2010

Я думаю

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 голосов
/ 18 октября 2010

вы уже пытались определить this.clone_array = []; в TestObject2 вместо этого?

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