Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript对象:函数的映射。如何返回默认值_Javascript - Fatal编程技术网

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方式完成的:)你可能会把你的解决方案作为答案发布在这里,这样其他人可能会看到你发现的有用的解决问题的方法。是的,我正在使用它…;)是的,这就是做事的方法。