2012-03-02 117 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」對象字面外定義的全局變量