可能是由于
this
脚本中的关键字。内部函数内部
这
指
window
或
global
对象。例如,
在下面的代码中,
this.filter
属于
this.filterBy
不引用存在于范围内的筛选器属性
IntegerParser
相反,它引用的变量定义为
var filter = 'stars'
. 把这个名字改成别的名字,你就会看到
undefined
而且它也不能在浏览器上工作。这就是你的问题所在。
var IntegerParser = function(filter){
this.parameter = '';
this.filter = filter;
this.parse = function(parameter){
this.parameter = parseInt(parameter);
}
this.filterBy = function(item){
return item[this.filter] == this.parameter;
}
}
而不是使用
这
您可以通过存储
这
到一个变量,供以后使用。如以下示例所示:
var IntegerParser = function(filter){
this.parameter = '';
this.filter = filter;
var self = this; // store this to self and use self in inner functions
this.parse = function(parameter){
self.parameter = parseInt(parameter);
}
this.filterBy = function(item){
return item[self.filter] == self.parameter;
}
}
包括我的解决方案在内的整个代码如下:
data = [{"stars": 3}, {"stars": 2}]
var ParseParameter = function(){
this.parser = "";
}
ParseParameter.prototype = {
setStrategy: function(parser) {
this.parser = parser;
},
parse: function(parameter) {
return this.parser.parse(parameter);
}
};
var IntegerParser = function(filter){
this.parameter = '';
this.filter = filter;
var self = this;
this.parse = function(parameter){
self.parameter = parseInt(parameter);
}
this.filterBy = function(item){
return item[self.filter] == self.parameter;
}
}
var filter = 'stars',
parameter = '2',
parseParameter = new ParseParameter();
var integerParser = new IntegerParser(filter);
parseParameter.setStrategy(integerParser);
parseParameter.parse(parameter);
var dataFiltered = data.filter(parseParameter.parser.filterBy);
console.log(dataFiltered);
它应该可以毫无问题地工作。请试试看它是否适合你。