1

構造体を関数のプロトタイプに関連付けてから、その関数で複数のオブジェクトをインスタンス化すると、それらはすべて構造体の同じインスタンスを共有します。オブジェクトがインスタンス化されるときに新しいインスタンスを明示的に作成する必要なしに、各オブジェクトに構造の独自のインスタンスを持たせたいです。それは可能ですか?

これが私がやろうとしていることの要約された例です:

function defineClass(constructor, instanceMembers) {
    constructor.prototype.model = instanceMembers.model;
    return constructor;
}

var visualObject = defineClass(function () { }, {
    model: {
        setPosition: function (x, y) {
            this.x = x;
            this.y = y;
        }
    }
});

var testA = new visualObject();
var testB = new visualObject();
testA.model.setPosition(10, 10);
console.log(testB.model.x); // outputs "1", but want it to be undefined

testA.modelとtestB.modelはどちらも同じエンティティを参照しているため、これは機能しません。

代わりに、構築時に構造を複製すると機能しますが、その複製操作を避けたいと思っています。このコードは機能しますが、私を傷つけます:

function defineClass(instanceMembers) {
    var constructor = function () {
        // Create a copy of the model member in this object instance
        this.model = $.extend(true, {}, this.model);
    };
    constructor.prototype.model = instanceMembers.model;
    return constructor;
}

var visualObject = defineClass({
    model: {
        setPosition: function (x, y) {
            this.x = x;
            this.y = y;
        }
    }
});

var testA = new visualObject();
var testB = new visualObject();
testA.model.setPosition(10, 10);
console.log(testB.model.x); // is undefined, as expected

javascriptは、インスタンス化のコピーを必要とせずにこれを行う方法を提供しますか?

4

2 に答える 2

2

ここで、prototype が何に使用されるかについて誤解があると思います。新しいクラスの各インスタンスの共有メンバーに使用されます。これらは通常、プロパティの値ではなく、関数の実装です。

2番目の例が機能する理由と、Bergieの答えが機能する理由は、最初にprototype.modelを定義し、後でコンストラクター(?)で上書きすることです。

問題の 2 番目の例では、次のことが起こります。

1位constructor.prototype.model = instanceMembers.model;

2番目 - コンストラクターがdefineClassから返された後、それが実行されthis.model = $.extend(true, {}, this.model);、プロトタイプからのモデルを上書きします。

したがって、プロパティのインスタンス化をプロトタイプに入れる必要はありませんが、コンストラクターに入れます。

ここでjavascriptプロトタイプに関する詳細な回答を確認してください。

于 2013-02-23T17:58:51.240 に答える
1

JavaScriptは、コピーオンインスタンス化を必要とせずにこれを行う方法を提供していますか?

はい。インスタンス化時に複製/コピーする代わりに、モデルに共通のプロトタイプ オブジェクトが必要です。

function defineClass(constructor, prototypeMembers) {
    $.extend(constructor.prototype, prototypeMembers);
    return constructor;
}

var ModelObject = defineClass(function() {}, {
    setPosition: function (x, y) {
        this.x = x;
        this.y = y;
    }
});
var VisualObject = defineClass(function() {
    this.model = new ModelObject;
});

var testA = new VisualObject;
var testB = new VisualObject;
testA.model.setPosition(10, 10);
console.assert(testA.model !== testB.model);
console.log(testB.model.x); // undefined
于 2013-02-23T17:35:50.400 に答える