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 からすべての値/メソッドを継承し、「new」が PHP OO の方法で期待どおりに動作する別の方法はありますか? (JSがこれを行っている方法は、私の脳が大学から正しく提供されているかのように、本当に奇妙であると確信していますJavaはこの点でPHPのように機能します)

4

3 に答える 3

10

基本的に

TestObject2.prototype = new TestObject(); 

TestObjectの単一インスタンスをTestObject2のプロトタイプチェーンに配置します。したがって、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

おもう

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 に答える
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 に答える