Javascript对象:函数图。如何返回默认值

时间:2014-05-29 15:46:05

标签: javascript

对不起这个问题的标题,但我找不到更好的。


引言

我的目标是创建一个对象,并将每个参数关联到一个函数。很简单!

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']()被解释为falseundefined

,那会很可爱

PS:我想在纯JavaScript中执行此操作;)

4 个答案:

答案 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');