对象文字调用默认属性

Object Literal Calling Default Property

本文关键字:属性 默认 调用 文字 对象      更新时间:2023-09-26

我正在努力处理JavaScript中的对象文字模式。我一直在努力实现丽贝卡·墨菲的例子,并对其进行了修改。

基本上我想能够做两件事

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['']);

您不需要传递整个函数,只需要传递属性。怎么样:

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,如此多的设计模式。。。。

只需将方法名称传递给Test,让它判断函数是否存在:

function Test(method){
    if (method in stuffToDo) {
        stuffToDo[method]();
    }
    else {
        stuffToDo.def();
    }
};
Test('');
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"answers"def"中的"myArr"参数是在函数范围内定义的新变量;它不会是在"stuffToDo"对象文字之外定义的全局变量

使用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/默认SO?language=javascript