是否可以创建或访问
交换JavaScript属性我想有某种JavaScript中偷懒initialied对象的属性,因此希望以某种方式超载读取属性和写入权限,即:是否可以创建或访问
var someval = myobj.lazyprop; // invokes myobj.get("lazyprop");
myobj.lazyprop = someval; // invokes myobj.set("lazyprop",someval);
myobj是我提供给脚本的一些对象。理由:我想在应用程序中使用Javascript(Rhino)作为脚本引擎,需要脚本访问的数据结构可能非常大且复杂。所以我不想将它们全部提前包装到javascript对象中,尤其是,因为这个应用程序中的平均脚本只需要它们的一小部分。另一方面,我希望脚本尽可能简单易读,所以我不希望在脚本中显式使用带字符串参数的get或set方法。
可以使用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; }
};
我认为这是你应该从Java方面使用Rhino特有的API;不是来自Javascript。
我已经在调查这一点,但因为它是包含在J2SE 1.6 JDK Rhino引擎只公开为微弱语言不可知的外部API和JVM的访问控制禁止使用它的内部类。使用原始的Mozilla Rhino也不适合我。 – x4u 2010-01-13 19:28:43
我没有说它不是Javascript功能。我说从Java方面做起来更好。但我会澄清。 – 2010-01-13 19:43:34
很多JS引擎支持的getter和setter的JavaScript对象:
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.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; }
};
如果您要从另一个网站剪切和粘贴长篇文章,您应该清楚地指定源代码(我看到您链接到2不同的网站,但没有提到你从第二个完整粘贴) – jspcal 2010-01-14 03:12:48
也应该注意到,根据mozilla文档,第一种形式(使用“__defineGetter__”):“可以使代码难以阅读和理解“,而在我的文章中的风格被推荐为”更紧凑和自然“。 – jspcal 2010-01-14 03:14:30
*可以使代码难以阅读和理解*是主观的。我觉得它很好,但我使用Python编码,底层系统是完全一样,只有你有一个'property'函数,而且当你需要覆盖现有的getter/setter时,'__defineGetter__' /'__defineSetter__'的用法非常有用,因为它们默默地覆盖了前面的getter/setter,而风趣h另一种语法,您必须先删除现有的语法。我真的不知道除了引用的文本和归属链接之外,还有哪些内容需要添加。如果没有阅读链接,IMO – voyager 2010-01-14 03:40:43