javascript - 获取 object.function 不是函数

标签 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

如果因为我的代码不好而导致测试未通过,我不介意自己修复它。我只是想知道为什么会出现错误。

非常感谢。

最佳答案

Group.from 是一个static 方法 - this 里面会引用 Group class,而不是实例。所以

return this.array = 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 函数,该函数已被排除在您发布的代码之外。

关于javascript - 获取 object.function 不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54471778/

相关文章:

javascript - 使用 Meteor (NPM) 导入库 jqGrid

javascript - 如何在 Angular 2 中获取 header 主体?

javascript - 同构应用程序中的用户配置文件

javascript - 根据里面的文字改变文本框的宽度

javascript - 窗口选择对象可以失效吗?

javascript - html 表单和 javascript

javascript - 如何将当前日期增加 20 分钟?

javascript - 通过 chrome.tabs.sendMessage 发送 DOM 节点对象

使用 'Back'/JavaScript 推迟后 JavaScript 消失

javascript - 单击两个链接时显示一个 Div