是否可以为Node.JS对象创建“before writing”代理?

时间:2018-01-15 07:12:49

标签: javascript node.js proxy

给出一个像:

这样的对象
<div class="mydiv">this should be a fixed aspect ratio div
  </div

我想在写“Proxy(或同等)之前加上它。该代理将充当中间件并执行类型检查。

例如,在执行var box = { number: 20 } 后,它会验证box.number = "30"。因为它不是,它会显示错误。

执行typeof === "number"不会触发代理。

我尝试了什么:

  • This。仅适用于未定义的属性。
  • Watcher.JS写入值,然后执行中间件(因为它是一个观察者)。中间件应该先执行。

我知道可以做到的事情:

  • 我知道我可以事先检查变量的box.number = 30。我正在寻找代理解决方案。
  • 自定义函数(getter&amp; setters)。我想试验代理,所有属性都有动态名称。

2 个答案:

答案 0 :(得分:2)

在我看来,并且考虑到你的需求,获取/设置是一种更好的方法,它们的执行时间更快,并且代码更容易保留。

GETTERS / SETTERS SOLUTION

自ES5到来以来是不是很好......

  
      
  • getter 是获取特定属性值的方法。
  •   
  • setter 是一种设置特定属性值的方法。
  •   
     

您可以在任何预定义的核心对象上定义getter和setter   用户定义的对象,支持添加新属性。该   定义getter和setter的语法使用object literal   语法。

+ info:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

var box = { 
    _number : 0,
    get number(){ return this._number },
    set number(value){ 
        /* your verifications here */
        if( typeof value !== 'number' ) throw new Error('Invalid input')
        /* if validates , asign value */
        this._number = value;
    }
}
// test...
box.number = "1234"; // FAIL
box.number = 1234;   // OK
box.number;          // output = 1234

PROXY SOLUTION

自ES6起可用。如果性能对您很重要,可能不合适。使用 GET / SET代理陷阱,以获得与上一示例相同的行为。

// your original object...
var box = {};
// create a proxy linked to your original object
var boxProxy = new Proxy( box , {
    get( obj, prop, receiver ){ return obj[prop] },
    set( obj, prop, value){ 
        /* check if the property trying to be written is 'number' */
        if( prop === 'number' ){
             /* your verifications here */
            if( typeof value  !== 'number' ) throw new Error('Invalid input')
            /* if validates , asign value */
            this._number = value;
        }
    } 
 });
// test...
boxProxy.number = "1234"; // FAIL
boxProxy.number = 1234;   // OK
boxProxy.number;          // output = 1234

在这两种情况下,如果您要求将box._number私有隐藏,您可以使用closures来实现它。

答案 1 :(得分:1)

以下是一个示例,您有验证码和默认值

var box =Object.create({},{
number: {    
    get: function() { return this._number || 0; },
    set: function(value) {
      if(typeof value!='number') throw new Error('error')
      this._number=value
    }
}
})

如果要隐藏私有_number,可以将其包含在函数中

var box=(function() {
    var _number
    var box =Object.create({},{
    number: {    
        get: function() { return _number || 0; },
        set: function(value) {
          if(typeof value!='number') throw new Error('error')
          _number=value
        }
    }
    })
    return box
})()

box.number=3

更多信息: