我有一个带有构造函数的类,如下所示:
class Bookshelf {
constructor(author, publisher) {
this.books = [],
this.numBooks = this.books.length
this.author = author,
this.publsiher = publisher
}
}
我没有找回我真正想做的书阵列的价值。我知道this
导致该值无法被获取,但我真的很想知道为什么吗?
答案 0 :(得分:0)
我根据标题来解释这个问题,以问为什么在您创建的numBooks
中向books
添加条目后Bookshelf
不会更新。
运行语句this.numBooks = this.books.length
时,确实会将名为numBooks
的属性设置为计算值this.books.length
,即0
。稍后,您可以向books
添加一个值,但这不会影响numBooks
。
问题不在于从另一个计算一个“类属性” ,而理解numBooks
存储一个数字,并且该数字不会自动更新< / em>。您的构造函数只运行一次即可。
与此比较:
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
不能提供的最新值的原因。 t自动更新。如果您希望将numBooks
保留为属性,还可以选择将books
属性设为私有,而可以使用公开添加书本并重置{{1 }}。
正如Patrick在评论中提醒我的那样,由于您指定了ES6,因此可以使用getter syntax来编写类似于属性的函数。之所以行之有效,是因为即使您的语法隐藏了细节,它在您引用addBook
时仍会运行代码。
numBooks