TypeError:无法调用undefined的方法'matches'

时间:2014-09-27 05:00:06

标签: javascript node.js jasmine

我正在编写一个节点模块,它针对一个单词测试一个单词数组,看它是不是一个字谜(我知道下面的测试功能还不正确),但是我遇到了错误标题中描述的那些。据我所知,这意味着应该包含方法的对象匹配'没有设置,我很难理解我是如何处理这个问题的。以下是anagram模块的内容:

var Anagram = function(a){

    this.word = a;

    this.matches = function(array){

        var found = [];

        for(var i = 0; i < array.length; i++){

            if(is_anagram(array[i],this.word)) found.push(array[i]);

        }
        return found;
    }
};

function is_anagram(word, check){
    if(word.length == check.length)return true;
    return false;
}

module.exports = Anagram;

在我的测试文件中(使用Jasmine:

var anagram = require('./anagram');

describe('Anagram', function() {

  it("no matches",function() {
    var subject = anagram("diaper");
    var matches = subject.matches([ "hello", "world", "zombies", "pants"]);

    expect(matches).toEqual([]);
  });
});

我对js还有点新鲜感。我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

var subject = anagram("diaper");

应该是

var subject = new anagram("diaper");

您已经创建了一个构造函数,但您正在使用它像普通函数一样。

为清楚起见,我可能也保持大写一致:

var Anagram = require('./anagram');

var subject = new Anagram("diaper");

修改

由于您无法更改测试代码以使用new,因此您应该更改程序的结构以自行创建对象实例。

function is_anagram(word, check){
  if (word.length == check.length) return true;
  return false;
}

module.exports = function(word){
  // Just return an object with a single 'matches' function
  return {
    matches: function(array){
      var found = [];

      for(var i = 0; i < array.length; i++){
        if (is_anagram(array[i], word)) found.push(array[i]);
      }
      return found;
    }
  };
};

或者甚至更清楚:

module.exports = function(word){
  return {
    matches: function(array){
      return array.filter(function(item){
        return is_anagram(item, word)
      });
    }
  };
};

答案 1 :(得分:1)

根据您的约束条件,您需要添加一个&#39;返回此&#39;在Anagram函数的最后:

var Anagram = function(a){
    this.word = a;
    this.matches = function(array){
        var found = [];

        for(var i = 0; i < array.length; i++){
            if(is_anagram(array[i],this.word)) found.push(array[i]);
        }
        return found;
    }
    return this;
};

此外,我建议将你的is_anagram函数放在Anagram中。