2016-07-27 4 views
3

У меня есть метод, как показано ниже, в C#.Задание параметра для передачи

void DoSomething(bool arg1 = false, bool notify = false) 
{ /* DO SOMETHING */ } 

Я могу указать, какой параметр я передаю методу, как это:

DoSomething(notify: true); 

вместо

DoSomething(false, true); 

Можно ли в JavaScript?

+2

Кажется, что вы запутали Javascript с Java. – hindmost

+4

Нет, это не так. Javascript не поддерживает аргументы с именем Call-time. – deceze

+0

В JavaScript есть только один тип переменной, т. Е. 'Var' – varit05

ответ

1

Это невозможно, но вы можете обойти это путем передачи объектов и добавления пользовательского кода

/** 
* This is how to document the shape of the parameter object 
* @param {boolean} [args.arg1 = false] Blah blah blah 
* @param {boolean} [args.notify = false] Blah blah blah 
*/ 
function doSomething(args) { 
    var defaults = { 
     arg1: false, 
     notify: false 
    }; 
    args = Object.assign(defaults, args); 
    console.log(args) 
} 

doSomething({notify: true}); // {arg1: false, notify: true} 

И вы можете обобщить это

createFuncWithDefaultArgs(defaultArgs, func) { 
    return function(obj) { 
     func.apply(this, Object.assign(obj, defaultArgs); 
    } 
} 

var doSomething = createFuncWithDefaultArgs(
    {arg1: false, notify: false}, 
    function (args) { 
     // args has been defaulted already 

    } 
); 

Обратите внимание, что Object.assign не поддерживается в IE, you may need a polyfill

+1

Никогда не знал о методе 'Object.assign'! Это похоже на то, что появилось во многих рамках, обычно как «mixin». Это удобно. – Katana314

+0

'Object.assign' кажется классным, я думаю, что' $ .extend' использует это. – jackjop

1

Вы можете достичь нечто подобного, передавая объект:

function DoSomething(param) { 
 
    var arg1 = param.arg1 !== undefined ? param.arg1 : false, 
 
     notify = param.notify !== undefined ? param.notify : false; 
 

 
    console.log('arg1 = ' + arg1 + ', notify = ' + notify); 
 
} 
 

 
DoSomething({ notify: true });

0

Pass объект в качестве аргумента:

function DoSomething(obj){ 

if (obj.hasOwnProperty('arg1')){ 

    //arg1 isset 
} 

if (obj.hasOwnProperty('notify')){ 

    //notify isset 
} 

} 

использование:

DoSomething({ 
notify:false 
}); 
+0

Что делать, если пользователь передает '{arg1: window .__ dont_exist}'? Лучшим тестом является 'obj.hasOwnProperty ('arg1')' или ''arg1' в obj' –

+0

Спасибо @JuanMendes –

2

Общей конвенции о ES2015 должен пройти an object as a single argument, присваивать значения по умолчанию для своих свойств и использовать деструктурирование внутри функции:

const DoSomething = ({ arg1 = false, notify = false } = {}) => { 
    /* DO SOMETHING */ 
}; 

DoSomething({ notify: true }); // In the function: arg1=false, notify= true 

Вы можете вызывать эту функцию без аргументов вообще, то есть DoSomething(), но это требует значения по умолчанию для объекта (= {} в конце списка аргументов).