我正在努力使用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['']);
答案 0 :(得分: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
好的,最后一个有点乱:)
javascript,这么多设计模式......
答案 1 :(得分:1)
只需将方法名称传递给Test
,然后让它判断该函数是否存在:
function Test(method){
if (method in stuffToDo) {
stuffToDo[method]();
}
else {
stuffToDo.def();
}
};
Test('');
答案 2 :(得分: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')
注意:传入'baz'和'def'的“myArr”参数是在函数范围内定义的新变量;它不是在“stuffToDo”对象文字
之外定义的全局变量答案 3 :(得分:0)
使用ES2xxx
可以轻松得多:
const defaultRoutine = input => {
console.info("running default method");
console.log(input);
};
const arrayOperatiion = (array = [], subroutine = defaultRoutine) => {
const subroutineType = typeof subroutine;
subroutineType === "function" ? subroutine(array) : console.error(`cannot execute subroutine of type ${subroutineType}`);
}
arrayOperatiion(['test']);
arrayOperatiion(['test'], "test");
https://repl.it/@ChristopherKeen/Defaults-SO?language=javascript