Некоторые из моих коллег и я экспериментировали с возвратом связанных функций от конструкторов.Конструктор Javascript возвращает связанную функцию?
Это позволяет нам выполнять эти функции, которые «строят» другие функции, не вызывая их buildDispatcher
или prepareAddition
. Позвольте мне привести пример:
function addition(a, b) {
return a + b;
}
function buildOffsetter(a) {
return (b) => addition(a, b);
}
var offsetter = buildOffsetter(42);
console.log(offsetter(10));
Если бы я должен был использовать конструктор вместо этого, я мог бы сделать это вместо того, чтобы:
function addition(a, b) {
return a + b;
}
function Offsetter(a) {
return (b) => addition(a, b);
}
var offsetter = new Offsetter(42);
console.log(offsetter(10));
Теперь, более реальный пример может выглядеть так:
function dispatchDataToUrl(url, data) {
$.ajax({
type: "POST",
url: url,
data: data,
error:() => console.log(`An error happened when sending [${data}] to [${url}].`)
});
}
function buildDispatcher(url) {
return (data) => dispatchDataToUrl(url, data);
}
var dispatcher = buildDispatcher("http://stackoverflow.com");
dispatcher("stackoverflow rocks");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
, который может быть построен так:
function dispatchDataToUrl(url, data) {
$.ajax({
type: "POST",
url: url,
data: data,
error:() => console.log(`An error happened when sending [${data}] to [${url}].`)
});
}
function Dispatcher(url) {
return (data) => dispatchDataToUrl(url, data);
}
var dispatcher = new Dispatcher("http://stackoverflow.com");
dispatcher("stackoverflow rocks");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Итак, мы на самом деле, как не имеющие их "строить" -функции, которые возвращают связанные функции.
Мой вопрос в том, есть ли недостатки для этого? Есть ли скрытая ловушка, к которой мы еще не наткнулись?
Отходы ресурсов в стороне (см. Ответ georg/[MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new#Description)), когда я вижу ' new Something() ', я ожидаю объект, а не функцию. Функции компоновщика намного яснее для меня. –
Но разве это не просто вопрос привычки? Отходы ресурсов. Привычки - это привычки. Если вы привыкли видеть определенные шаблоны, другие образцы могут казаться менее ясными, пока вы не привыкнете их видеть. – ath88
Да, конечно, это стилистический выбор - не пытайтесь понять, что вы ошибаетесь, чтобы так поступать! Я просто не вижу ценности лично. –