用静态方法实现列表 javascript

implement a list with a static method javascript

我必须按照以下说明重新实现一个列表和 forEach 方法:

// 不要 在您的解决方案中构造任何数组文字 ([])。

// 不要 在你的解决方案中通过 new Array 构造任何数组。

// 请不要在您的解决方案中使用任何Array.prototype方法。

// 您可以使用 Iterable 中的解构和扩展 (...) 语法。

结果应如下所示:

const list = List.create(1, 2)
list.forEach((item) => console.log(item))

这是我不完整的解决方案:

export class List {

  constuctor(){
    
  }

  public static create(...values: number[]): List {
    // Do *not* construct any array literal ([]) in your solution.
    // Do *not* construct any arrays through new Array in your solution.
    // DO *not* use any of the Array.prototype methods in your solution.

        // You may use the destructuring and spreading (...) syntax from Iterable.
        List list = new List();
        values.forEach(function(item){
          list.push(item);
        });  
        return list;
      }
    
      public forEach(callback: any){
        for (let i = 0; i<this.length ; i++){
           callback(this[i], i, this);
        }
      }
    
    }

在创建循环中,但问题是,作为静态方法,this 无法识别

已编辑感谢评论

...this is not recognised

是的。但是你还没有给 this 任何 属性。这是因为:

  • constuctor应该写成constructor
  • 您需要定义一个 push 方法(因为您在 create 中调用了它)
  • 您需要定义一个 length 属性(因为您在 forEach 中引用了它)

此外,还有一些其他问题:

  • 您写的是 Array.prototype 函数不能使用,但是您的代码有 values.forEach(),...所以这违反了该规则。请改用 for..of 循环。

这是你的代码,其中包含这些评论:

class List {
  constructor() {
    this.length = 0;    
  }

  push(value) {
    this[this.length++] = value;
  }

  static create(...values) {
    let list = new List();
    for (let item of values) {
      list.push(item);
    }
    return list;
  }
    
  forEach(callback) {
    for (let i = 0; i < this.length ; i++) {
      callback(this[i], i, this);
    }
  }
}


const list = List.create(1, 2)
list.forEach((item) => console.log(item))

备注

上面的“测试”会很好,但是当对属性的赋值也能正常工作时,比如 list[2] = 3,那么还有更多事情需要处理。以这个程序为例:

const list = List.create(1, 2);
list[5] = 42; // should update length
list.check = true; // should not update length
console.log("length = " + list.length);
console.log("enumerable keys are " + Object.keys(list));
list.forEach((item) => console.log(item)); // should not output empty slots
list.length = 1; // should delete some index properties
list.forEach((item) => console.log(item)); // should not output deleted items

...那么输出应该是:

length = 6
enumerable keys are 0,1,5,check
1
2
42
1

您可以通过捕获对属性的访问并使 length 成为 getter/setter 来实现这一点。但是您还需要区分属于 数组索引 和哪些不是的属性,因此 all-in-all 这将使代码变得不那么琐碎。