@writ/utils
Version:
My tool kit
58 lines (54 loc) • 1.46 kB
JavaScript
let rules = {
get(target, key) {
invariant(key, 'get');
return target[key];
},
set(target, key, value) {
invariant(key, 'set');
target[key] = value;
return true;
},
has(target, key) {
if (key[0] === '_') {
return false;
}
return key in target;
},
deleteProperty(target, key) {
invariant(key, 'delete');
return true;
},
getOwnPropertyDescriptor(target, key) {
if (key[0] === '_') {
return;
}
return Object.getOwnPropertyDescriptor(target, key);
},
getPrototypeOf() {
return null;
},
isExtensible: function () {
return false;
},
ownKeys(target) {
return Reflect.ownKeys(target).filter(key => key[0] !== '_');
},
preventExtensions: function (target) {
Object.preventExtensions(target);
return true;
},
setPrototypeOf(target, proto) {
throw new Error(`禁止修改${target}的${proto}`);
}
};
// 禁止操作内部属性
function invariant(key, action) {
if (key[0] === '_') {
throw new Error(`禁止对内部属性 [[${key}]] 进行 "${action}" 操作!`);
}
}
function defineBlockObject(object, block) {
block = Object.assign({}, rules, block);
return new Proxy(object, block);
}
module.exports = defineBlockObject;