2010-01-13 111 views
1

交换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方法。

回答

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

};

+0

如果您要从另一个网站剪切和粘贴长篇文章,您应该清楚地指定源代码(我看到您链接到2不同的网站,但没有提到你从第二个完整粘贴) – jspcal 2010-01-14 03:12:48

+0

也应该注意到,根据mozilla文档,第一种形式(使用“__defineGetter__”):“可以使代码难以阅读和理解“,而在我的文章中的风格被推荐为”更紧凑和自然“。 – jspcal 2010-01-14 03:14:30

+0

*可以使代码难以阅读和理解*是主观的。我觉得它很好,但我使用Python编码,底层系统是完全一样,只有你有一个'property'函数,而且当你需要覆盖现有的getter/setter时,'__defineGetter__' /'__defineSetter__'的用法非常有用,因为它们默默地覆盖了前面的getter/setter,而风趣h另一种语法,您必须先删除现有的语法。我真的不知道除了引用的文本和归属链接之外,还有哪些内容需要添加。如果没有阅读链接,IMO – voyager 2010-01-14 03:40:43

1

我认为这是你应该从Java方面使用Rhino特有的API;不是来自Javascript。

+0

我已经在调查这一点,但因为它是包含在J2SE 1.6 JDK Rhino引擎只公开为微弱语言不可知的外部API和JVM的访问控制禁止使用它的内部类。使用原始的Mozilla Rhino也不适合我。 – x4u 2010-01-13 19:28:43

+0

我没有说它不是Javascript功能。我说从Java方面做起来更好。但我会澄清。 – 2010-01-13 19:43:34

2

很多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/

+0

该语法被超级赞成。 – 2010-01-13 19:36:10

+1

它根本不被弃用。这种风格*仅添加*在ECMAScript 5中 - JavaScript的最新*版本 – jspcal 2010-01-13 20:01:52

+0

@jspcal:你是对的 - 不知道Oo;检查ECMA-262,第5版,例如第11.1.5节 – Christoph 2010-01-13 20:12:02

2

犀牛版本>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; } 
};