Javascript: Невозможно распечатать свойство объекта, определенное Object.defineProperty - PullRequest
0 голосов
/ 12 января 2019

Я использую Object.defineProperty метод для определения свойства объекта:

const o = { a: 1 }
Object.defineProperty(o, 'b', {
  get() {
    return this.a
  }, set(value) {
    this.a = value
  }
})

Однако, когда я использую console.log, пытаюсь напечатать объект o, свойство b, похоже, отсутствует в нем.

Но когда я пытаюсь использовать o.b для доступа к нему, он может вернуть правильное значение

Итак, я запутался: почему свойство не может быть напечатано, но к нему можно получить доступ?

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Вы можете получить propertyNames используя Object.getOwnPropertyNames

const o = { a: 1 }
Object.defineProperty(o, 'b', {
  get() {
    return this.a
  }, set(value) {
    this.a = value
  }
})

console.log(Object.getOwnPropertyNames(o))
0 голосов
/ 12 января 2019

Свойства, добавленные с .defineProperty(), по умолчанию не перечисляются .

Сделайте их "видимыми", установив enumerable: true

var foo = {}
Object.defineProperty(foo, "a", {
  get() { return "a"; }
});

Object.defineProperty(foo, "b", {
  get() { return "b"; },
  enumerable: true
});

console.log(Object.keys(foo));
0 голосов
/ 12 января 2019

Ну, у вас есть свои перечисляемые свойства и все свои свойства объекта.

Чтобы получить все перечисляемые собственные свойства, вы можете взять Object.keys, а для получения не перечислимых свойств вы также можете взять Object.getOwnPropertyNames.

Может быть console.log показывает только перечисляемые свойства объекта. Эта реализация зависит от поставщика.

const o = { a: 1 }
Object.defineProperty(o, 'b', {
  get() {
    return this.a
  }, set(value) {
    this.a = value
  }
})

console.log(o);
console.log(Object.keys(o));
console.log(Object.getOwnPropertyNames(o));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...