给出一个像:
这样的对象<div class="mydiv">this should be a fixed aspect ratio div
</div
我想在写“Proxy(或同等)之前加上它。该代理将充当中间件并执行类型检查。
例如,在执行var box = { number: 20 }
后,它会验证box.number = "30"
。因为它不是,它会显示错误。
执行typeof === "number"
不会触发代理。
我尝试了什么:
我知道可以做到的事情:
box.number = 30
。我正在寻找代理解决方案。答案 0 :(得分:2)
在我看来,并且考虑到你的需求,获取/设置是一种更好的方法,它们的执行时间更快,并且代码更容易保留。
自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
自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