Это плохая практика, чтобы прикрепить функцию стрелки к другой функции стрелки - PullRequest
0 голосов
/ 03 сентября 2018

Предположим, что this не требуется ни в одной из этих функций. Это работает

const add = (x, y) => x + y
add.foo = () => 4
console.log(add(1, 1))
console.log(add.foo())

и я думаю, что это очень полезно для упаковки обработчиков запросов API и вызовов функций, например (при условии express.js):

const getPost = async (postId) => db.get(postId) // assuming db.get will get the post

getPost.handler = async (req, res, next) => {
  try {
    const { postId } = req.body
    res.send(await getPost({ postId }))
  } catch (err) {
    next(err)
  }
}

Затем я могу использовать app.post('/get-post', getPost.handler) и все еще иметь хорошо тестируемую функцию getPost.

Мне кажется, это хорошо, мне просто интересно, является ли это принятой практикой или есть что-то, о чем я не думаю.

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018
const add = (x, y) => x + y

В приведенном выше коде add - это объект, прототип которого - Function.prototype. Как и любой объект в JavaScript, он может иметь свойства. Эти свойства могут быть объектами любого рода. Включая объекты, прототип которых будет Function.prototype.

Это неплохая практика. Родной язык фактически использует это. Поскольку ваш объект прототипа Function.prototype изначально предоставляет такие функции, как Function.prototype.call или Function.prototype.apply

Например:

const add = (x, y) => x + y
console.log(add.call(undefined, 3, 4));
0 голосов
/ 03 сентября 2018

Я бы посоветовал вам избегать такого рода реализации, поскольку в будущем это может привести к проблеме, если Комитет TC39 решит добавить новое свойство с тем же именем некоторого свойства, которое вы уже использовали.

Вероятно, этого не произойдет с handler (но это возможно), но если вы начнете делать это в своем коде, будет соблазнительно начать расширять эти свойства все больше и больше.

Был недавний случай, связанный с этой проблемой, который привлек много внимания. Подробнее об этом вы можете прочитать здесь: https://dev.to/kayis/smooshing-javascript--5dpc

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

Функции - это объекты и объекты, полученные методами. Это обычная практика в JS, фактически все статические свойства классов являются частью функции конструктора:

 new Promise()
 Promise.resolve()

Или возьмите jquery:

 $("div")
 $.ajax(/*...*)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...