是否可以构造一个对象,以便在请求其键时引发错误?

时间:2018-09-21 19:45:47

标签: javascript object metaprogramming interceptor

假设我有以下代码:

const object = {};
// an error should be thrown
object.property.someMethod();
// an error should be thrown
object.foo;

调用someMethod()或调用任何其他不存在的属性时是否可能引发错误?

我想我需要对它的原型进行一些处理以引发错误。但是,我不确定应该怎么做。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:7)

是的,使用带有Proxy陷阱的handler.get()

const object = new Proxy({}, {
  get (target, key) {
    throw new Error(`attempted access of nonexistent key \`${key}\``);
  }
})

object.foo

如果要使用此行为修改现有对象,则可以使用Reflect.has()检查属性是否存在,并确定是否使用Reflect.get()throw转发访问:

const object = new Proxy({
  name: 'Fred',
  age: 42,
  get foo () { return this.bar }
}, {
  get (target, key, receiver) {
    if (Reflect.has(target, key)) {
      return Reflect.get(target, key, receiver)
    } else {
      throw new Error(`attempted access of nonexistent key \`${key}\``)
    }
  }
})

console.log(object.name)
console.log(object.age)
console.log(object.foo)