Вычисляемое свойство класса из другого свойства класса (ES6) - PullRequest
0 голосов
/ 24 октября 2018

У меня есть класс с конструктором, как показано ниже:

class Bookshelf {  
 constructor(author, publisher) {
  this.books = [],
  this.numBooks = this.books.length
  this.author = author,
  this.publsiher = publisher
 }
}

Я не возвращаю значение массива книги, что я действительно хочу сделать.Я знаю, что this не позволяет получить значение, но я действительно хочу понять, почему?

1 Ответ

0 голосов
/ 24 октября 2018

Я интерпретирую этот вопрос, основываясь на заголовке, чтобы спросить, почему numBooks не обновляется после добавления записи в books в Bookshelf, который вы создаете.

Когда вы запускаетеоператор this.numBooks = this.books.length устанавливает свойство с именем numBooks в вычисленное значение this.books.length, равное 0.Позже вы можете добавить значение к books, но это не влияет на numBooks.

Проблема не в том, что вычисляет одно "свойство класса" из другого понимая, что numBooks хранит номер, и этот номер не обновляется автоматически .Ваш конструктор запускается один раз, и все.

Сравните с этим:

class Bookshelf {  
 constructor(author, publisher) {
  this.books = [];
  this.author = author;
  this.publisher = publisher;
 }

 getNumBooks() {
  return this.books.length;
 }
}

let myBookshelf = new Bookshelf("Isaac Asimov", "Bantam Press");
myBookshelf.books.push("I, Robot");
console.log(myBookshelf.getNumBooks());   // prints 1

Поскольку ваш вызов getNumBooks() запускает код, он может вычислить динамическое значение this.books.length, котороепочему он дает вам актуальное значение, когда свойство numBooks не обновляется автоматически.Если вы предпочитаете хранить numBooks как свойство, у вас также есть возможность сделать свойство books приватным и вместо этого выставить функцию addBook, которая добавляет книгу и сбрасывает numBooks соответственно.

Как Патрик напоминает мне в комментариях, поскольку вы указали ES6, вы можете использовать getter синтаксис , чтобы написать функцию, которая действует как свойство.Это работает, потому что он выполняет код, когда вы ссылаетесь на numBooks, даже если синтаксис скрывает эту деталь.

class Bookshelf {  
 constructor(author, publisher) {
  this.books = [];
  this.author = author;
  this.publisher = publisher;
 }

 get numBooks() {
  return this.books.length;
 }
}

let myBookshelf = new Bookshelf("Isaac Asimov", "Bantam Press");
myBookshelf.books.push("I, Robot");
console.log(myBookshelf.numBooks());   // prints 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...