假定在任何这些功能中都不需要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`);
})
函数。
这对我来说似乎很好,我只是想知道这是公认的做法,还是我没有想到的事情。
答案 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