1

私のタイトルはちょっと変わっているように見えますが、私は自分がやろうとしていることを正確に説明しようとしました。オブジェクトがあるとしましょう:

function testObj(data) {
    this.id = data.id
    this.getObjFromId = function() {
        //Return some value from somewhere using the this.id
    }
    this.obj = this.getObjFromId();
}

これを行う理由は、this.idプロパティを更新できるようにするためであり、this.objは常に更新されたIDを使用して他のオブジェクトを返します。現在、これが行うことは、最初に元のIDを使用してgetObjFromId関数を呼び出し、戻り値をthis.objに格納することです。私がこのようなことをした場合:

var testObj = new TestObj({id: 1});
alert(testObj.obj); //Returns Foo1
testObj.id = 5; //Update the object with a new id
alert(testObj.obj); //Returns Foo1, but should return Foo5

this.obj関数をthis.obj()のような関数として呼び出すことができれば、これは簡単ですが、さまざまな理由(テンプレートなど)でこれが不可能であるため、動的に取得できる必要があります。 this.objを使用するだけで、this.obj「関数」からの値。

これが理にかなっていることを願っています。私が書いているとき、私はその混乱を理解しているので、これを行うためのより良いアプローチがあるかもしれません。それでも、私が提案している機能は、オブジェクトプロパティから動的な値を呼び出すことができる場合と同じように機能する必要があります。私の質問のタイトルは、誰かが更新したいと思っている場合、私の問題をより説明するものとしてより適しているかもしれませんが、私は説明するためのより良い方法を考えることができませんでした。

4

2 に答える 2

2

プロパティにgetter関数を使用したい:obj

function TestObj(data) {
    this.id = data.id
    Object.defineProperty(this, "obj", {
        get: function() {
            //Return some value from somewhere using the this.id
        }
    });
}

また、IDを設定した場合にのみidプロパティを更新する、プロパティのセッター関数を使用することもできます。objこれは、キャッシュに役立つ可能性があります。

function TestObj(data) {
    var id = data.id, obj;
    Object.defineProperty(this, "id", {
        get: function() { return id; },
        set: function(newval) {
            id = newval;
            obj = this.getObjFromId();
    });
    Object.defineProperty(this, "obj", {
        get: function() { return obj; }
    });
}
TestObj.prototype.getObjFromId = function() {
    //Return some value from somewhere using the this.id
};
于 2012-09-15T15:09:40.700 に答える
0

getObjFromId直接電話してみませんか

var testObj = new TestObj({id: 1});
alert(testObj.getObjFromId());

getObjFromIdさらに、作成するすべてのインスタンスに対してのインスタンスが作成されるため、コードは最適ではありませんTestObjgetObjFromIdTestObjのプロトタイプの値として宣言する必要があります。

function TestObj(data) {...}
TestObj.prototype.getObjFromId = function(){...}

編集

直接呼び出すgetObjFromIdことができない場合は、オブジェクトの状態を更新する別の関数を作成します。電話する代わりに

testObj.id = 'newId';

あなたは電話します

testObj.update('newId');//internally, call getObjFromId and/or update id field
于 2012-09-15T15:17:41.407 に答える