我想在javascript中有一些懒惰的初始对象属性,因此想要以某种方式重载属性读写访问,即:。
var someval = myobj.lazyprop; // invokes myobj.get("lazyprop");
myobj.lazyprop = someval; // invokes myobj.set("lazyprop",someval);
其中myobj是我提供给脚本的一些对象。
基本原理:我想在应用程序中使用Javascript(Rhino)作为脚本引擎,脚本需要访问的数据结构可能非常庞大和复杂。所以我不想提前将它们全部包装到javascript对象中,尤其是。因为此应用程序中的平均脚本只需要一小部分脚本。另一方面,我希望脚本尽可能简单易读,因此我不希望在脚本中明确使用带有字符串参数的get或set方法。
答案 0 :(得分:2)
许多js引擎支持javascript对象上的getter和setter:
var obj = {
get field() {alert('getting field');}
set field(val) {alert('setting field to ' + val);}
}
var x = obj.field // alert pops up
obj.field = 'hello' // alert pops up
更多详情:
http://robertnyman.com/2009/05/28/getters-and-setters-with-javascript-code-samples-and-demos/
答案 1 :(得分:2)
您可以使用Rhino 1.6R6或更高版本javascript getters and setters来执行此操作。
function Field(val){ var value = val; this.__defineGetter__("value", function(){ return value; }); this.__defineSetter__("value", function(val){ value = val; });
}
现在,如果我们想要在对象原型的上下文中定义getter和setter(并且“私有”数据的关注点不那么重要),那么我们可以使用替代对象语法。
function Field(val){ this.value = val;
}
Field.prototype = { get value(){ return this._value; }, set value(val){ this._value = val; }
};
答案 2 :(得分:2)
Rhino版本> 1.6R6支持getter和setter,你可以这样写:
var myobj = {
// a getter and setter
get lazyprop(){ return this.get('lazyprop'); },
set lazyprop(val){ return this.set('lazyprop', val); },
// the logic of your get and set methods:
get: function(p) { return this['_'+p]; },
set: function(p, val) { this['_'+p] = val; }
};
答案 3 :(得分:1)
我认为您应该使用Java端的Rhino特定API来做这件事;不是来自Javascript。