从另一个类属性(ES6)计算出的类属性

时间:2018-10-24 03:44:50

标签: javascript ecmascript-6 this

我有一个带有构造函数的类,如下所示:

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

我没有找回我真正想做的书阵列的价值。我知道this导致该值无法被获取,但我真的很想知道为什么吗?

1 个答案:

答案 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