Опции объекта Javascript: функция или ноль - PullRequest
0 голосов
/ 09 сентября 2018

Этот вопрос, возможно, задавался ранее, но я не знаю правильных ключевых слов, чтобы найти решение в Google, поэтому все мои исследования вернули 0 :) Или, что лучше, все мои исследования заканчивались «необязательными параметрами». «но для функций.

Предположим, у меня есть этот класс:

var Class = function (params) {
    // I get the data somehow
    params.name(data);
}

Проблема в том, что не каждый раз, когда я создаю экземпляр new Class(), мне также нужно установить name(), например:

new Class({
    name: function (data) {
        // Do something with the data
    }
    ... other params ...
})

Но с указанным выше синтаксисом, если я не объявляю параметр имени как функцию, выдается ошибка params.name is not a function:

// Error
new Class({
    ... other params ...
})

Мой вопрос: есть ли способ установить params.name() в качестве необязательного параметра (в объекте), который может быть функцией или вообще не существовать (например, null)? Что-то вроде высказывания: «когда вы создаете экземпляр класса:

  • если вы объявите name: function (data) {} => тогда: params.name(data) - это функция
  • если вы пропустите name => все равно все в порядке (ошибка не выдается) "

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

В ES6, вы можете использовать параметр функции по умолчанию , например

var Class = function(params = {
  name: (x) => x
}) {
  // I get the data somehow
  data='value';
  params.name(data);
}

Class();
Class({name: x => console.log(x)});

Надеюсь, это поможет!

EDIT

Да @ Бриго, вы правы, извините, я упустил этот момент. На самом деле мы ищем вложенный дефолт. Возможным решением может быть деструктурирование объекта внутри функции, например

var Class = function(params = {}) {
  // I get the data somehow
  data = 'value';
  withDefaultParams = {
    name: (x) => x,
    ...params
  }
  withDefaultParams.name(data);
}

Class();
Class({
  name: x => console.log('non-default')
});
Class({
  others: x => console.log('non-default')
});
0 голосов
/ 09 сентября 2018

Если вы используете jQuery, вы можете использовать метод extend ( API docs ), как в следующем примере:

var Class = function(params) {

  var _defaults = {
      name: function(){},
      some: 'other stuff'
  };

  params = jQuery.extend(_defaults,params);

  // I get the data somehow
  data='value';
  params.name(data);
}

Class();
Class({foo:'bar'});
Class({name: console.log });
0 голосов
/ 09 сентября 2018

да, вы можете сделать что-то вроде

if (typeof param.name === 'function') {
    param.name(data);
} else {
    // dont do anything or do something different
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...