Можно ли построить объект так, чтобы он выдавал ошибку при запросе его ключей? - PullRequest
0 голосов
/ 21 сентября 2018

Представьте, что у меня есть следующий код:

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

Возможно ли выдать ошибку при вызове someMethod() или при вызове какого-либо другого несуществующего свойства?

Я думаю, что мне нужно что-то сделать с его прототипом, чтобы выдать ошибку.Тем не менее, я не уверен, что именно я должен делать.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 21 сентября 2018

Да, используя 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)
...