在我看来,考虑到您的需求,get/set 是一种更好的方法,它们的执行时间更快,并且代码更易于维护。
GETTERS/SETTERS 解决方案
自 ES5 到来以来就一直存在...
-
getter 是一种获取特定属性值的方法。
-
setter 是一种设置特定属性值的方法。
您可以在任何预定义的核心对象上定义 getter 和 setter,或者
支持添加新属性的用户定义对象。这
定义 getter 和 setter 的语法使用对象字面量
语法。
+信息: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 来实现它。