虽然我的头衔似乎有点不稳定,但我试图准确描述我想要做的事情。说我有一个对象:
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“函数”中获取动态值我希望这是有道理的。在我写作时,我理解它的混乱,所以也许有更好的方法来做到这一点。尽管如此,我建议的功能需要工作相同,我可以从对象属性调用动态值。如果有人关心更新,我的问题标题可能更适合作为我的问题的描述,但我想不出更好的描述方式。
答案 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