我正在编写一个节点模块,它针对一个单词测试一个单词数组,看它是不是一个字谜(我知道下面的测试功能还不正确),但是我遇到了错误标题中描述的那些。据我所知,这意味着应该包含方法的对象匹配'没有设置,我很难理解我是如何处理这个问题的。以下是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还有点新鲜感。我在这里缺少什么?
答案 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中。