Javascript getter - PullRequest
       11

Javascript getter

1 голос
/ 29 марта 2019

Учитывая, что следующий код foo, bar и baz фактически одинаковы?Что если преимущество использования ключевого слова get?

var getValue = function () {
  return 'value';
}

var foo = {
  value: getValue(),
};

var bar = {
  get value() {
    return getValue();
  },
};

var baz = {
  get value() {
    return 'value';
  },
};

console.log('foo.value', foo.value); // foo.value value
console.log('bar.value', bar.value); // bar.value value
console.log('baz.value', baz.value); // baz.value value

1 Ответ

2 голосов
/ 29 марта 2019

Учитывая, что следующий код foo, bar и baz фактически одинаков?

Нет, совсем нет.

  • foo будет иметь свойство value, которое будет результатом вызова getValue при создании foo и не будет вызывать getValue позднее.

  • bar будет иметь свойство value, которое при доступе, например, bar.value, вызывает getValue и возвращает его возвращаемое значение.

  • baz будет иметь свойство value с явным значением 'value'.

Различия:

  • Будет ли getValue называться
  • Когда getValue называется

Это более очевидно с некоторыми журналами и с немного обновленной версией getValue:

var getValue = function () {
  var value = Math.floor(Math.random() * 1000);
  console.log("getValue called, returning " + value);
  return value;
}

console.log("Creating foo");
var foo = {
  value: getValue(),
};

console.log("Creating bar");
var bar = {
  get value() {
    return getValue();
  },
};

console.log("Creating baz");
var baz = {
  get value() {
    return 42;
  },
};

console.log("Calling foo");
console.log('foo.value', foo.value);
console.log("Calling bar");
console.log('bar.value', bar.value);
console.log("Calling baz");
console.log('baz.value', baz.value);
.as-console-wrapper {
  max-height: 100% !important;;
}

Преимущество (и недостаток) геттера заключается в том, что вы можете выполнять логику (например, вызов getValue) в ответ на то, что выглядит как простой поиск свойства (bar.value, а не bar.value() или bar.getValue()) .

...