我正在开发一个项目,其中,我想编写一些插件类型的代码,让开发人员扩展其功能的功能。让我们假设,我想构建一个计算器,并支持在运行中添加功能:
function newCalc(newFn) {
var fns = $.extend({
add: function(a,b) {
done(a+b);
}
}, newFn);
var done = function(num) {
alert('Outcome is: ' + num);
}
return fns;
}
var calc = newCalc({
substract: function(a,b) {
done(a-b);
}
});
calc.add(4, 2);
calc.substract(4, 2);
但是,我没有按照预期得到结果。 calc.add()
工作正常,但calc.substract()
抱怨done()
功能不可用。
任何人都可以帮我解决这个问题吗?我怎样才能完成减法操作?
答案 0 :(得分:3)
问题是done
是一个内部函数,不会暴露在外面。
当您执行return fns;
时,new Calc
将只有fns
而没有其他值。
您可以使用this
关键字将函数/变量分配给当前上下文。请记住,只需指定this.prop
但不要返回它。如果您归还,它将成为公共财产。不返回会将其保密,但可以在所有实例中访问。
您可以尝试这样的事情:
function newCalc(newFn) {
var add = function(a, b) {
done(a + b);
}
// This is a private function.
// Accessible across all objects but is not available outside
this.done = function(num) {
alert('Outcome is: ' + num);
}
// Add default properties
var retObj = {
add: add
};
// Add dynamic properties that are passed as parameters
var keys = Object.keys(newFn);
// Loop over all properties passed in object
for (var i = 0; i < keys.length; i++) {
retObj[keys[i]] = newFn[keys[i]];
}
return retObj;
}
var calc = newCalc({
substract: function(a, b) {
done(a - b);
}
});
calc.add(4, 2);
calc.substract(4, 2);
console.log(calc)
calc.done(1 + 2);
&#13;
答案 1 :(得分:0)
newCalc
函数中的变量fns
只能在函数内部访问。当您返回变量done
时,外部无法访问变量function newCalc(newFn) {
var fns = $.extend({
add: function(a,b) {
this.done(a+b);
},
done: function(num){
alert('Outcome is: ' + num);
}
}, newFn);
return fns;
}
var calc = newCalc({
substract: function(a,b) {
this.done(a-b);
}
});
。
以下是解决方法:
fns
当您返回calc
时,完成也包含在其中。
用于初始化另一个变量var calc = newCalc({
substract: function(a,b) {
this.done(a-b);
}
});
。它应该是这样的:
this
请注意,我将this.done(a-b)
放在this
上。 fns
对象引用newCalc
返回的calc.add(4, 2);
。
因此不会出现ReferenceError语句。当您运行calc.subtract(4, 2);
和{{1}}
答案 2 :(得分:0)
你可以在没有如下所示的大变化的情况下做到这一点。
try{
List<Customer> list = (List<Customer>) genericList;
list.get(0).methodOfCustomer();
isCustomer = true;}
catch(Exception e){
isCustomer = false
}