Спецификаторы объектов в 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 - отличный вариант. Какой еще способ сделать это, задав разные значения по умолчанию для каждого свойства? Есть ли способ создать объект с различными значениями по умолчанию и сравнить с ним?
Ответы
Ответ 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 без какой-либо библиотеки.