2015-01-01 4 views
1

Мне нужна функция, чтобы ее параметр был объектом, и если я оставлю его пустым, он будет загружать значения по умолчанию.Javascript - функция с дополнительными параметрами как объект?

что-то вроде:

function loadMap(args) { //args is an object and its optional 

    //this is what I want to do, test args and load defauts if necesary 
    /* 
    pseudocode: 
    if args.latitude is not set then 
     give it a default value 

    if args.longitude is not set then 
     give it a default value 

    end pseudocode */ 

    alert("Latitude is "+args.latitude); 
    alert("Longitude is "+args.longitude); 
} 

//outputs the default values 
loadMap(); 

//outputs custom values 
loadMap({latitude: "x.xxxx", longitude: "-x.xxxx"}); 

//and should work too and output one default and one custom value 
loadMap({latitude: "x.xxxx"}); 

Я нашел это решение в этом вопросе (Is there a better way to do optional function parameters in Javascript?), но это требует JQuery: http://jsfiddle.net/xy84kwdv/

Это почти то, что я хочу, но я не хочу зависеть от функция jquery.

ответ

3

Вы ищете что-то вроде:

function loadMap(args) { 
    args = args || {}; 
    args.latitude = args.latitude || "X.XXX"; 
    args.longitude = args.longitude || "Y.YYY"; 
    alert(args.latitude); 
    alert(args.longitude); 
}; 

loadMap({latitude:"custom_latitude"}); 
+0

http://jsfiddle.net/f5nqnwc1/ - как вы можете видеть, что не будет вести себя, как и ожидалось, если вы передаете только один пользовательский значение и оставить остальное пустым – JuanBonnett

+0

Адаптировано. Это работает для вас? – Trace

+0

Я протестировал его. И он отлично работает ... код чист, в этом нет ничего сложного, в отличие от других 10000 алгоритмов, чтобы достичь того же ... Ваше решение является лучшим до сих пор! – JuanBonnett

0

How to overload functions in javascript? Заканчивать второй ответ на ОР. Он предлагает альтернативу использованию jQ.

Примечание: код Kim приведет к логической ошибке, если args пройдет, но оценит значение true. Лучшее исправление: optionalArg = (typeof optionalArg === "undefined")? "defaultValue": optionalArg;

+1

Не отправляйте ссылки только для ответов. Отметьте этот вопрос как дубликат. – Barmar

3

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

var defaults = { latitude: x, longitude: y }; 
function loadMap(args) { 
    args = args || {}; 
    for (var key in defaults) { 
     if (!(key in args)) { 
      args[key] = default[key]; 
     } 
    } 
    ... 
} 
+0

Я добавил комментарий, но я не хорошо прочитал ваш ответ ... Кажется, это тоже работает, и это очень чисто – JuanBonnett

0

Overkill, ввести полномасштабную объект клонирования (ECMAScript 5.1)

function cloneOwnProperties(A, B, overwrite) { // this is shallow 
    var i, p; 
    if (!(A instanceof Object)) { 
     if (undefined === A) A = {}; 
     else throw new TypeError('cloneOwnProperties called on non-object'); 
    } 
    if (!B) B = {}; 
    p = Object.getOwnPropertyNames(A); 
    for (i = 0; i < p.length; ++i) 
     if (overwrite || !(p[i] in B)) 
      Object.defineProperty(B, p[i], Object.getOwnPropertyDescriptor(A, p[i])); 
    return B; 
} 

// and for completeness 
function cloneObject(obj_in, clone_seal, clone_frozen) { 
    var obj_out; 
    if (!(obj_in instanceof Object)) 
     throw new TypeError('cloneObject called on non-object'); 
    obj_out = Object.create(Object.getPrototypeOf(obj_in)); 
    cloneOwnProperties(obj_in, obj_out, true); 
    if (clone_seal && Object.isSealed(obj_in)) Object.seal(obj_out); 
    if (clone_frozen && Object.isFrozen(obj_in)) Object.freeze(obj_out); 
    return obj_out; 
} 
// back on topic 

Теперь вы можете использовать он устанавливает некоторые значения по умолчанию

function foo(bar) { 
    bar = cloneOwnProperties(bar, { 
     fizz: true, 
     buzz: false 
    }, true); 
    return bar; 
} 

foo({buzz: 'user_value'}); // {fizz: true, buzz: "user_value"} 
0

Конечно, этот вопрос уже более 3 лет (2018-03-02). Я искал об этой теме, но большинство вопросов, которые я получил, и ответы, занятые сверху, выглядели как устаревшие, например this, this, this, или this.

В настоящее время lots of browsers поддержка ES6/ECMAScript 2015 (6-е издание ECMAScript). Для совместимости вы можете использовать WebpackJs (или другой упаковщик) и BabelJs (или другой компилятор) для компиляции и упаковки ваших ES6-кодов на ES5. И ответ ES6-версии для этого вопроса может быть Object Destructuring.

function drawES2015Chart({size = 'big', cords = {x: 0, y: 0}, radius = 25} = {}) { 
    console.log(size, cords, radius); 
    // do some chart drawing 
} 

drawES2015Chart({cords: {x: 18, y: 30}, radius: 30}); 

function fn(requiredArg, {optionalArg = 'Default Value', a = 1, b ={some: 'object'}} = {}){ 
    // Do with destructured values: requiredArg, optionalArg, a, and b. 
    console.log(requiredArg, optionalArg, a, b); 
} 

так и для вашего вопроса, то это будет:

function loadMap({latitude = "x.xxxx", longitude = "-x.xxxx"} = {}) { 
    console.log('latitude is:', latitude, 'and longitude is:', longitude); 
    console.log(`latitude is: ${latitude}, and longitude is: ${longitude}`); 
} 

// Call the function. 
loadMap({latitude: "1.2345", longitude: "-6.7890"}); 
Смежные вопросы