2012-03-02 115 views
0

我正在用JavaScript中的对象字面值模式挣扎。我一直在努力实现,Rebecca Murphy's example - 与我自己的修改。对象直接调用默认属性

基本上我希望能够做两件事情

1)如果没有属性传递 - 我想如果以与阵列沿一个属性被传递默认属性/例程所执行

2) - 相应的属性/功能应执行使用通过的对象

我想知道是否有一个更简单的方法来实现这个,而不是调用函数内的函数。

var myArr = ["test1", "test2", "test3"]; 

    var stuffToDo = { 
     bar: function() { 
      alert('the value was bar -- yay!'); 
      console.log(myArr); 
     }, 

     baz: function (myArr) { 
      alert('boo baz :('); 
      console.log(myArr); 
     }, 

     def: function (myArr) { 
      alert('default'); 
      console.log(myArr); 
     } 

    }; 

    function Test(varPass) 
    { 
     if (varPass) { 
      varPass(); 
     } else { 
      stuffToDo['def'](); 
     } 
    }; 

    Test(stuffToDo['']); 

回答

2

你并不需要通过全功能的,只是财产。如何:

function Test(prop, arg) { 
    (stuffToDo[prop] || stuffToDo.def)(arg); 
}; 

Test('whatever', myArr); 

另一种方式我能想到的是定义stuffToDo作为测试功能,然后添加对象文本作为该功能的静态方法:

var stuffToDo = function(prop, arg) { 
    (stuffToDo[prop] || stuffToDo.def)(arg); 
} 

stuffToDo.bar = function(arr) { alert('bar'); } 
stuffToDo.def = function() { alert('default'); } 

stuffToDo('bar'); 

甚至(封装对象):

var stuffToDo = function(prop, arg) { 
    ({ 
     bar: function(arr) { 
      alert(arr[0]); 
     }, 
     baz: function() { 
      alert('baz'); 
     } 
    }[prop] || function() { 
     alert('default'); 
    })(arg); 
} 

stuffToDo('bar', [1,2,3]);​ 
stuffToDo('404'); // default 

OK,上一次是有点混乱:)

的JavaScript,这么多的设计模式....

+0

+1使用“||”:-) – 2012-03-02 21:46:24

+1

这是一些严格的语法。 – firedrawndagger 2012-03-02 21:54:21

1

只是传递方法名Test,让它计算出如果该功能存在与否:

function Test(method){ 
    if (method in stuffToDo) { 
     stuffToDo[method](); 
    } 
    else { 
     stuffToDo.def(); 
    } 
}; 

Test(''); 
1
var myArr = ["test1", "test2", "test3"];   

var stuffToDo = function(){  
var toDo = {  bar: function() {      
    alert('the value was bar -- yay!');   
    alert(myArr);   
    console.log(myArr);    
},    
baz: function (myArr) { 
    alert('boo baz :('); 
    console.log(myArr); 
}, 
def: function() { 
    alert('default'); 
    console.log(myArr); 
}}; 

return function(param, args){ 
    if(!param) { 
     toDo.def(args); 
    } else { 
     toDo[param](args); 
    } 
}; 

}(); 

stuffToDo() 
stuffToDo('bar') 
stuffToDo('baz', 'argsTest') 

注:“myArr,该”参数传递到“巴兹”和“DEF”是函数的范围内所定义的新变量;它不会是在“stuffToDo”对象字面外定义的全局变量