0

JavaScriptのオブジェクトリテラルパターンに苦労しています。私は、RebeccaMurphyの例を自分で変更して実装しようとしています。

基本的に2つのことができるようになりたい

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

4 に答える 4

2

関数全体を渡す必要はなく、プロパティだけを渡す必要があります。どうですか:

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

Test('whatever', myArr);

私が考えることができるもう1つの方法は、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、非常に多くのデザインパターン...

于 2012-03-02T21:45:31.047 に答える
1

メソッド名をに渡してTest、関数が存在するかどうかを判断させます。

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

Test('');
于 2012-03-02T21:44:06.030 に答える
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」オブジェクトリテラルの外部で定義されたグローバル変数にはなりません

于 2012-03-02T22:05:27.027 に答える
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

于 2020-01-16T21:46:24.600 に答える