【问题标题】:Calculated Class property from another Class Property (ES6)从另一个类属性计算的类属性(ES6)
【发布时间】:2018-10-24 03:44:50
【问题描述】:

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

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

我没有找回我真正想做的 book 数组的价值。我知道this 导致价值没有被抓取,但我真的很想知道为什么?

【问题讨论】:

  • 那些逗号是干什么用的?请改用分号。另外,不清楚你在找什么,books 被初始化为一个空数组...?
  • 你能展示更多的代码来演示这个问题吗?我不确定你的目标是什么。
  • new Bookshelf().books 应该返回您分配给 this.books 的空数组 - 但我同意之前的 cmets,您的“问题”很难察觉
  • @4castle 我要创建书籍并希望将它们添加到Bookshelf,然后打印Bookshelf 实例以查看其中包含的内容

标签: javascript ecmascript-6 this


【解决方案1】:

根据标题,我将这个问题解释为在您创建的Bookshelf 中向books 添加条目后,为什么numBooks 没有更新。

当您运行语句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

正如 Patrick 在 cmets 中提醒我的那样,由于您指定了 ES6,因此您可以使用 getter syntax 编写一个像属性一样起作用的函数。这是有效的,因为当您引用 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

【讨论】:

  • get numBooks()
  • 这非常接近我想要做的但是如果我想将书籍的数量添加到实例myBookshelf 我会用myBookshelf.numOfBooks = myBookshelf.getNumBooks() 这样做但是这将如何动态完成?
  • @Justlearning 在 ES6 之前,您的选择是让 getNumBooks() 像我一样成为一个函数,或者编写一个添加到 books 数组(例如 addBook)的函数,以保持您的 numBooks 属性已更新。不过,从 ES6 开始,Patrick 正确地指出您可以 write a "getter" using ES6 "get syntax" 实际运行一个函数,但 看起来 像一个普通属性。您永远不会明确地将 this.numBooks 设置为数字,但 myBookshelf.numBooksthis.numBooks 会按照您的意愿行事。
猜你喜欢
  • 1970-01-01
  • 2020-05-17
  • 2022-06-23
  • 2020-09-01
  • 1970-01-01
  • 2017-06-07
  • 2020-03-05
  • 1970-01-01
  • 2016-03-03
相关资源
最近更新 更多