从对象属性调用函数而不使用括号

时间:2012-09-15 15:04:29

标签: javascript

虽然我的头衔似乎有点不稳定,但我试图准确描述我想要做的事情。说我有一个对象:

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“函数”中获取动态值

我希望这是有道理的。在我写作时,我理解它的混乱,所以也许有更好的方法来做到这一点。尽管如此,我建议的功能需要工作相同,我可以从对象属性调用动态值。如果有人关心更新,我的问题标题可能更适合作为我的问题的描述,但我想不出更好的描述方式。

2 个答案:

答案 0 :(得分:2)

您想为obj媒体资源使用getter function

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

同样,您可以为id属性使用setter函数,该属性仅在您设置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
};

答案 1 :(得分: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