如何在JavaScript中访问未正确实例化对象的属性时抛出错误
你的写法不生效的核心原因是读取函数对象的属性不会触发函数执行,只有主动调用person()时才会执行函数内的报错逻辑。要实现读取对象任意属性就自动抛出错误,最通用的方案是使用ES6提供的Proxy做属性访问拦截:
方案1:Proxy实现(推荐)
Proxy可以拦截对象的所有属性读取、写入等操作,不需要提前预知会访问的属性名:
// 定义未实例化的占位对象 const person = new Proxy({}, { // 拦截所有属性读取操作 get(target, property) { throw new Error('Person not instantiated!'); }, // 可选:拦截所有属性写入操作,赋值时也抛错 set(target, property, value) { throw new Error('Person not instantiated!'); } }); // 测试效果 const x = person.age; // 直接抛出 Error: Person not instantiated! person.name = 'Jack'; // 开启set拦截后,赋值也会抛错
后续你完成实例化后,直接把person变量赋值为正常的实例对象即可,不会影响后续正常使用。
方案2:预定义属性getter(兼容旧环境)
如果你的运行环境不支持ES6 Proxy,可以提前给占位对象的所有可能被访问的属性定义getter,缺点是需要预先知道所有会用到的属性名:
const person = {}; // 列出所有可能被访问的属性,批量定义getter ['age', 'name', 'gender', 'id'].forEach(prop => { Object.defineProperty(person, prop, { get() { throw new Error('Person not instantiated!'); }, configurable: true // 允许后续实例化时覆盖该属性 }); });
内容的提问来源于stack exchange,提问作者Daniel Frühauf
相关产品推荐
相关产品推荐

