获取object.function不是函数

时间:2019-02-01 01:46:40

标签: javascript

我在javascript中制作了一个名为Group的类,其中包含一些方法。当我尝试测试这些方法时,控制台会抛出“ x不是函数”,我不确定为什么。

这是代码

class Group {
  constructor(){
    this.array= []
  }
  add(number){
    this.array.push(number);
  }
  delete(number){
    this.array = filter(this.array, n => n != number);
  }
  has(number){
    for(let value in this.array){
      if(value === number) return true;
    return false;
    }
  }  
  static from(object){
    return this.array = object;
  }
}

这是测试

let group = Group.from([10, 20]);
console.log(group);
console.log(group.has(10));
// → true
console.log(group.has(30));
// → false
group.add(10);
group.delete(10);
console.log(group.has(10));
// → false

如果由于我的代码不好而未通过测试,则我不介意自己修复该问题。我只是想知道为什么会收到错误消息。

非常感谢您。

1 个答案:

答案 0 :(得分:4)

Group.from是一个 static 方法-其内部的this将引用Group class ,而不是实例。所以

return this.array = object;

分配给,然后返回传递的object本身,这不是您想要的。

使用new返回实例-更改构造函数以接受默认为空数组的数组,该数组分配给实例的.array属性:

class Group {
  constructor(arr = []) {
    this.array = arr;
  }
  add(number) {
    this.array.push(number);
  }
  delete(number) {
    // need to define your filter method for this delete method to work
    // this.array = filter(this.array, n => n != number);
  }
  has(number) {
    for (let value in this.array) {
      if (value === number) return true;
    }
    return false;
  }
  static from(arr) {
    return new this(arr);
    // could also do return new Group(arr), but that's less flexible
  }
}

let group = Group.from([10, 20]);
console.log(group);
console.log(group.has(10));
// → true
console.log(group.has(30));
// → false
group.add(10);

请注意,您的delete方法取决于您的filter函数,该函数未包含在您发布的代码中。