Javascript对象:函数的映射。如何返回默认值
对不起,这个问题的标题,但我找不到更好的Javascript对象:函数的映射。如何返回默认值,javascript,Javascript,对不起,这个问题的标题,但我找不到更好的 导言 我的目标是创建一个对象,并为每个参数关联一个函数。非常简单 var canIDoThis = { one: function(a, b, c){}, two: function(a){}, three: function(){} } 我想用这种方式呼叫canidotthis if(canIDoThis['one'](x, y, z)) { // do somthing } if(canIDoThis['two'
导言 我的目标是创建一个对象,并为每个参数关联一个函数。非常简单
var canIDoThis = {
one: function(a, b, c){},
two: function(a){},
three: function(){}
}
我想用这种方式呼叫canidotthis
if(canIDoThis['one'](x, y, z)) {
// do somthing
}
if(canIDoThis['two'](w)) {
// do somthing
}
if(canIDoThis['three']()) {
// do somthing
}
// myVariable can be equalso to "one" or "two" or "three"
var myVarable;
if(canIDoThis[myVarable]()) {
// do somthing
}
// 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!
}
如果我有一个可以是“一”、“二”或“三”的var
,我可以这样使用这个canidotthis
if(canIDoThis['one'](x, y, z)) {
// do somthing
}
if(canIDoThis['two'](w)) {
// do somthing
}
if(canIDoThis['three']()) {
// do somthing
}
// myVariable can be equalso to "one" or "two" or "three"
var myVarable;
if(canIDoThis[myVarable]()) {
// do somthing
}
// 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!
}
我的问题 我想管理所有
myVarable
值。
现在如果我调用canidotthis['four']()
我会得到明显的未捕获类型错误:未定义不是函数
我的问题
是否有办法防止uncaughttypeerror
的默认行为并返回默认值?如果canidotthis['four']()
被解释为false
或undefined
PS:我想在纯JavaScript中实现这一点;) 在尝试调用它之前,请检查它是否未定义
// 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
}
在尝试调用之前,请检查CanidotThis[myVarable]是否有值。在使用typeof
调用属性之前,请尝试检查属性是否为函数
// 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
}
if (typeof(canIDoThis[myVarable]) === 'function') {
canIDoThis[myVarable]();
}
使用“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')代码>发布的所有解决方案都很好地解决了这个问题,但我正在搜索类似“Cath the exception and handle it”或“set a default behavior”之类的内容
但这种方式似乎是不可能的
我更喜欢使用面向对象风格的解决方案
这就是解决方案
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);
}
}
然后以这种方式使用它
if(canIDoThis['one'](x, y, z)) {
// do somthing
}
if(canIDoThis['two'](w)) {
// do somthing
}
if(canIDoThis['three']()) {
// do somthing
}
// myVariable can be equalso to "one" or "two" or "three"
var myVarable;
if(canIDoThis[myVarable]()) {
// do somthing
}
// 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!
}
这个解决方案对我的用例非常有效,但可以改进。为什么不使用面向对象的方法来创建带有getter和stuff的类函数呢?在我看来,面向对象的方法是最正确的方法…;)我在寻找另一种方式。链接添加一些自定义异常处理程序或类似的内容。但也许不是那么简单。。。无论如何,我是用OO方式完成的:)你可能会把你的解决方案作为答案发布在这里,这样其他人可能会看到你发现的有用的解决问题的方法。是的,我正在使用它…;)是的,这就是做事的方法。