【问题标题】:Object Literal Calling Default Property对象字面量调用默认属性
【发布时间】:2012-03-02 21:38:56
【问题描述】:

我正在为 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['']);

【问题讨论】:

    标签: javascript object-literal


    【解决方案1】:

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

    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,这么多设计模式......

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:
        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”对象字面量之外定义的全局变量

        【讨论】:

          【解决方案4】:

          使用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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-08-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-17
            • 2012-07-11
            • 2010-12-05
            • 2020-06-09
            相关资源
            最近更新 更多