Я интерпретирую этот вопрос, основываясь на заголовке, чтобы спросить, почему 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