将箭头功能附加到另一个箭头功能是不好的做法

时间:2018-09-03 12:41:13

标签: javascript node.js express

假定在任何这些功能中都不需要const add = (x, y) => x + y add.foo = () => 4 console.log(add(1, 1)) console.log(add.foo()) 。可行

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)
  }
}

并且我认为它对于打包api请求处理程序和函数调用非常有用,例如(假设express.js):

app.post('/get-post', getPost.handler)

然后我可以使用getPost并仍然具有可测试的const express = require('express'); const app = express(); const bodyParser = require('body-parser'); const mongoose = require('mongoose'); const Schema = mongoose.Schema; app.use(bodyParser.json()); mongoose.connect("mongodb://localhost/gpsTest") .then(() => console.log('Connected to MongoDB...')) .catch(err => console.error(('Could not connect to MongoDB...\n'), err)) const NinjaSchema = new Schema({ name: { type: String, }, rank: { type: String, }, available: { type: Boolean, default: false }, geometry: { type: { type: String, default: "Point", index: '2dsphere' }, coordinates: { type: [Number] } } }) NinjaSchema.index({geometry: '2dsphere'}); const Ninja = mongoose.model('ninja', NinjaSchema); app.post('/ninjas', (req, res) => { Ninja.create(req.body).then(ninja => { res.send(ninja); }) }) app.get('/ninjas', (req, res) => { Ninja.find({}).where('location').nearSphere({center: { type: 'Point', coordinates : [parseFloat(req.query.lng), parseFloat(req.query.lat)], spherical: true }} ).then(ninjas => { res.send(ninjas); }); }) app.listen(3030, () => { console.log(`listening port: 3030`); }) 函数。

这对我来说似乎很好,我只是想知道这是公认的做法,还是我没有想到的事情。

3 个答案:

答案 0 :(得分:1)

函数是对象,对象是方法。那是JS中的惯例,实际上,类的所有静态属性都是构造函数的一部分:

 new Promise()
 Promise.resolve()

或者使用jquery:

 $("div")
 $.ajax(/*...*)

答案 1 :(得分:1)

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));

答案 2 :(得分:0)

我建议您避免这种实施,因为将来如果TC39委员会决定添加与您已经使用过的某些财产同名的新财产,将来可能导致问题。

testNLopt可能不会发生(但可能会发生),但是如果您开始在代码中执行此操作,那么将越来越有魅力地开始扩展这些属性。

最近有一个与此问题有关的案例引起了很多关注。您可以在此处了解更多信息:https://dev.to/kayis/smooshing-javascript--5dpc