2016-11-17 4 views
0

Некоторые из моих коллег и я экспериментировали с возвратом связанных функций от конструкторов.Конструктор 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>

Итак, мы на самом деле, как не имеющие их "строить" -функции, которые возвращают связанные функции.

Мой вопрос в том, есть ли недостатки для этого? Есть ли скрытая ловушка, к которой мы еще не наткнулись?

+0

Отходы ресурсов в стороне (см. Ответ georg/[MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new#Description)), когда я вижу ' new Something() ', я ожидаю объект, а не функцию. Функции компоновщика намного яснее для меня. –

+0

Но разве это не просто вопрос привычки? Отходы ресурсов. Привычки - это привычки. Если вы привыкли видеть определенные шаблоны, другие образцы могут казаться менее ясными, пока вы не привыкнете их видеть. – ath88

+1

Да, конечно, это стилистический выбор - не пытайтесь понять, что вы ошибаетесь, чтобы так поступать! Я просто не вижу ценности лично. –

ответ

3

x = new Something() где Something возвращает объект точно * такие же, как x = Something() исключения того, что new отходов несколько ресурсов, выделяющих новый объект, который в конечном счете выброшен. Таким образом, единственное фактическое различие между вашими buildOffsetter и Offsetter - их именование. Что касается недостатков, выделение памяти, которую вы не собираетесь использовать, - плохая идея.


* При условии Something является конструктором, а не полагаться на его this.

+0

Мне обычно сложнее иметь хорошее имя, чем поддерживать низкий объем памяти. Разве Фил Карлтон не сказал что-то умное об именовании? :) – ath88

Смежные вопросы