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
        }
    });
}

同样,您可以对属性使用 setter 函数,该函数仅在您设置 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的每个TestObj实例创建一个实例。您应该声明getObjFromId为 TestObj 原型的值:

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 回答