代码之家  ›  专栏  ›  技术社区  ›  x4u

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

  •  1
  • x4u  · 技术社区  · 15 年前

    我希望在javascript中具有某种延迟初始化的对象属性,因此希望以某种方式重载属性的读写访问,即:

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

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

    理由:我想在应用程序中使用JavaScript(Rhino)作为脚本引擎,脚本需要访问的数据结构可能非常大和复杂。所以我不想把它们都提前包装到javascript对象中,特别是,因为这个应用程序中的平均脚本只需要它们中非常小的一个子集。另一方面,我希望脚本尽可能简单易读,因此我不希望在脚本中显式地使用带有字符串参数的get或set方法。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Esteban Küber    15 年前

    你可以用 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
  •   jspcal    15 年前

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

        3
  •  2
  •   Christian C. Salvadó    15 年前

    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; }
    };
    
        4
  •  1
  •   Nicolás    15 年前

    我认为这是你应该使用来自Java端的犀牛特定API的东西,而不是JavaScript。