UNPKG

@writ/utils

Version:
58 lines (54 loc) 1.46 kB
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;