对不起这个问题的标题,但我找不到更好的。
引言
我的目标是创建一个对象,并将每个参数关联到一个函数。很简单!
var canIDoThis = {
one: function(a, b, c){},
two: function(a){},
three: function(){}
}
我希望以这种方式致电canIDoThis
if(canIDoThis['one'](x, y, z)) {
// do somthing
}
if(canIDoThis['two'](w)) {
// do somthing
}
if(canIDoThis['three']()) {
// do somthing
}
如果我有一个var
可以是“一个”,“两个”或“三个”我可以用这个方式来这样做
// myVariable can be equalso to "one" or "two" or "three"
var myVarable;
if(canIDoThis[myVarable]()) {
// do somthing
}
我的问题
我想管理所有myVarable
值。
现在,如果我致电canIDoThis['four']()
,我显然会Uncaught TypeError: undefined is not a function
我的问题
有没有办法阻止Uncaught TypeError
的默认行为并返回默认值?如果canIDoThis['four']()
被解释为false
或undefined
PS:我想在纯JavaScript中执行此操作;)
答案 0 :(得分:1)
在使用typeof
调用属性之前,请尝试检查该属性是否为函数。
if (typeof(canIDoThis[myVarable]) === 'function') {
canIDoThis[myVarable]();
}
答案 1 :(得分:1)
发布的所有解决方案都是问题的良好转变,但我正在寻找像#" Cath这样的例外并处理它"或"设置默认行为" ...
但这种方式似乎是不可能的。
我更喜欢使用面向对象的样式解决方案。
这是解决方案......
function Context(type) {
var _type = type,
// all the functions in config returs true or false, depens on the value of p
_config = {
one: function(p){},
two: function(p){},
three: function(p){}
},
_defaultBehaviour = function() {return false;}
this.canIDoThis = function(param){
var fn = this._config[_type] || _defaultBehaviour;
return fn(param);
}
}
然后以这种方式使用它
// type can be absolutly anything
var type,
param = {/*some dynamic params in an Object*/},
context = new Context(type)
if (context.canIDoThis(params)) {
// good! Let's go!
} else {
// stop, access not allowed!
}
这个解决方案对我的用例非常有用,但可以改进。
答案 2 :(得分:0)
在尝试调用它之前检查它是否未定义。
// myVariable can be equalso to "one" or "two" or "three"
var myVarable;
var fn = canIDoThis[myVarable];
if(fn && fn()) { // Only invokes fn if it's not falsey; if it's undefined, it won't try to call it
// do somthing
}
在尝试调用之前检查canIDoThis [myVarable]是否有值。
答案 3 :(得分:0)
使用“getter”函数代替对象。这样,您可以在尝试调用之前检查方法是否存在。
function getValue(name){
var canIDoThis = {
one: function(a, b, c){},
two: function(a){},
three: function(){}
}
if(typeof canIDoThis[name] === 'function'){
return canIDoThis[name].apply(canIDoThis, [].slice.call(arguments, 1));
}
else{
return false; // Default return value
}
}
然后您可以getValue('one', x, y, z);
或getValue('four');
。