开发者问题收集

如何在类中定义数组长度?获取长度未定义错误

2022-01-20
373

我必须从数组中写入所有参与者,每个参与者都应该在新行上。到目前为止,我有这个代码。

class Movie {
  constructor(movieName, releaseDate, actors) {
    this.movieName = movieName;
    this.releaseDate = releaseDate;
    this.actors = actors;
  }
  printDetail() {
    console.log(this.movieName);
    console.log(this.releaseDate);

    function actrs() {

      for (let i = 0; i < Movie.actors.length; i++) {
        console.log("test if this actually works");
      }

    }
    actrs();
  }
}

let movie1 = new Movie("moviename", "releasedate", ["John Jackies", "Jack Johnies"]);
movie1.printDetail();

所以,我说的是“for”循环。我该如何定义它的数组长度?无论我做什么,我总是得到这个错误:“未捕获的类型错误:无法读取未定义的属性(读取‘长度’)”。

3个回答

您正在访问 Movie static (但未定义)属性,而 actors 是在构造新的 Movie 实例时定义的成员属性。

应使用 this 关键字访问 actors 属性,该关键字引用 Movie 实例

for (let i = 0; i < this.actors.length; i++) { /* ... */ }
// or
this.actors.forEach((actor) => { /* ... */ });
Zulfe
2022-01-20

改用实例变量。另外,删除 actrs 函数,因为它是不需要的,并且会更改 this 的值。

class Movie {
  constructor(movieName, releaseDate, actors) {
    this.movieName = movieName;
    this.releaseDate = releaseDate;
    this.actors = actors;
  }
  printDetail() {
    console.log(this.movieName);
    console.log(this.releaseDate);

    for (let i = 0; i < this.actors.length; i++) {
      console.log("test if this actually works");
    }
  }
}

let movie1 = new Movie("moviename", "releasedate", ["John Jackies", "Jack Johnies"]);
movie1.printDetail();
evolutionxbox
2022-01-20

这里有几件事。您指的是 Movie 。它没有静态字段或方法。您想要的是它的实例。如您所知,执行此操作的正确方法是使用 this 关键字。

我猜您在 for 循环中尝试过它,但它没有工作。这是因为 this 上下文在 function 中不同。为了使其工作,您必须将 Movie.actors.length 更改为 this.actors.length ,然后在声明后绑定该函数:

const boundActrs =  actrs.bind(this);
actrs();

这将使其工作。另一种方法是使用箭头函数,它不会更改 this 上下文:

const actrs = () => {    
  for (let i = 0; i < this.actors.length; i++) {
    console.log("test if this actually works");
  }
}

但是,这不是干净的代码。我会将其设为私有函数,或者只在 printDetail 中使用 for 循环,而不需要额外的函数。

Ibrahim
2022-01-20