Спецификаторы объектов в Javascript - программирование
Подтвердить что ты не робот

Спецификаторы объектов в Javascript

В книге Дугласа Крокфорда "Javascript: Good Parts" он упоминает спецификаторы объектов при передаче значений новому объекту. По существу, вместо передачи параметров функции в определенном порядке он предлагает передать объект с параметрами, содержащимися внутри, следующим образом:

var myObject = someFunction({a: 1, b: 2, c: 3});

Однако не объяснено, как обрабатывать эти параметры после их прохождения. Вместо того, чтобы устанавливать следующие значения по умолчанию:

function someFunction(params){
    this.a = params.a || 0; 
    this.b = params.b || 0;
    ...
}

Какой еще способ обрабатывать большое количество параметров, не будучи таким подробным?


РЕДАКТИРОВАТЬ: Глядя на ответы ниже, использование цикла for-in - отличный вариант. Какой еще способ сделать это, задав разные значения по умолчанию для каждого свойства? Есть ли способ создать объект с различными значениями по умолчанию и сравнить с ним?

4b9b3361

Ответ 1

Обычно это делается с помощью объекта defaults, из которого вы копируете свойства, если они не существуют в параметрах. Этот объект может быть приватным или доступным для публики для конфигурации.

var defaults = { a:null, b:1, ...};
function someFunction(params) {
    for (var prop in defaults)
        if (prop in params)
            this[prop] = params[prop];
        else
            this[prop] = defaults[prop];
}

или

function someFunction(custom) {
    var params = { a:null, b:1, ...};
    for (var prop in custom)
        params[prop] = custom[prop];
    // now use params
}

Иногда также объекты custom/params, которые передаются в функцию, распространяются самостоятельно, но затем в документах следует явно указать, что объект может быть изменен:

var defaults = { a:null, b:1, ...};
function someFunction(params) {
    // modifies params object!
    for (var prop in defaults)
        if (! (prop in params))
            params[prop] = defaults[prop];
    // now use params
}

Если вы используете библиотеку с функцией extend, вы часто можете сократить эту инициализацию до

    var params = $.extend({}, defaults, custom);
    // create an empty object, copy the defaults, and overwrite with custom properties

Ответ 2

Как насчет использования цикла для

function someFunction(params){

    for(var key in params){
       if( params.hasOwnProperty(key){
           var def = null;
           if(key == 'a' || key == 'b'){
              def = 10;
           }
           if(key == 'c' || key == 'd'){
              def = undefined;
           }
           this[key] = params[key]  || def ;
       }
    }
}

Ответ 3

Прокрутите поля в объекте, переданном как параметр, создавая каждое поле как поле на этом объекте.

function someFunction(params){
   for(x in params){
     this[x] = params[x];
   }
}

Рабочий пример: http://jsfiddle.net/59kzD/

Ответ 4

Расширение ответа Берги: var params = $.extend({}, defaults, custom);

Теперь мы можем использовать Object.assign({}, defaults, custom) в ES6 без какой-либо библиотеки.