是否可以在访问时创建或交换Javascript属性

时间:2010-01-13 19:12:39

标签: javascript oop rhino lazy-evaluation

我想在javascript中有一些懒惰的初始对象属性,因此想要以某种方式重载属性读写访问,即:。

var someval = myobj.lazyprop; // invokes myobj.get("lazyprop");
myobj.lazyprop = someval;     // invokes myobj.set("lazyprop",someval);

其中myobj是我提供给脚本的一些对象。

基本原理:我想在应用程序中使用Javascript(Rhino)作为脚本引擎,脚本需要访问的数据结构可能非常庞大和复杂。所以我不想提前将它们全部包装到javascript对象中,尤其是。因为此应用程序中的平均脚本只需要一小部分脚本。另一方面,我希望脚本尽可能简单易读,因此我不希望在脚本中明确使用带有字符串参数的get或set方法。

4 个答案:

答案 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。