Объектный литерал, вызывающий свойство по умолчанию - PullRequest
0 голосов
/ 03 марта 2012

Я борюсь с литеральным шаблоном объекта в 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['']);

Ответы [ 3 ]

2 голосов
/ 03 марта 2012

Вам не нужно передавать всю функцию, только свойство.Как насчет:

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

even (инкапсуляция объекта):

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 голос
/ 03 марта 2012
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», передаваемые в «baz» и «def», являются новыми переменными, определенными в области действия функции;это не будет глобальная переменная, определенная вне литерала объекта "stuffToDo"

1 голос
/ 03 марта 2012

Просто передайте имя метода на Test и дайте ему понять, существует функция или нет:

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

Test('');
...