2012-09-15 37 views
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财产和使用更新的ID this.obj总是会返回一些其他对象。现在它所做的是最初使用原始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

你想用一个getter functionobj属性:

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 
}; 
+0

哪些浏览器在这个工作呢? – jfriend00

+0

IE 9+,FF 4+,Chrome 5+,Safari 5.1+,Opera 11.6+ –

+0

['get'关键字](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/get)和['__defineGetter__'弃用方法](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineGetter)在旧版本中受支持 - 当然,您可以'不要期望它能在IE中工作: -/ – Bergi

0

你为什么不叫getObjFromId直接像

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

此外,你的代码是不是最佳的,因为它会为你创建的每一个TestObj实例创建的getObjFromId一个实例。你应该申报getObjFromId作为TestObj的原型值:

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

编辑

如果直接调用getObjFromId是不是一种选择,那么我会创建另一个函数来更新对象的状态。 与其说

testObj.id = 'newId'; 

,你会打电话

testObj.update('newId');//internally, call getObjFromId and/or update id field 
+0

感谢您的优化提示。我同意,但正如我在问题中提到的,我不能像这样调用getObjFromId函数。这是由于我的模板设置和其他一些原因。 – ryandlf

+0

@ryandlf我看到了,我已经更新了我的答案 –

相关问题