Javascript nodejs中模块函数/类的实例
我有一个以ES5.1开始的项目,后来我将其更改为支持ES6,所以我使用了async await,let 现在我需要一个类似实例的模块/对象 我找到了一篇解释这个过程的帖子,但是 当我这样做时:Javascript nodejs中模块函数/类的实例,javascript,node.js,ecmascript-6,ecmascript-5,multiple-instances,Javascript,Node.js,Ecmascript 6,Ecmascript 5,Multiple Instances,我有一个以ES5.1开始的项目,后来我将其更改为支持ES6,所以我使用了async await,let 现在我需要一个类似实例的模块/对象 我找到了一篇解释这个过程的帖子,但是 当我这样做时: 'use strict'; let _ = require('lodash'); var mappings; function SafeRequestHandler(reqMappings) { if (!(this instanceof SafeRequestHandler)) {
'use strict';
let _ = require('lodash');
var mappings;
function SafeRequestHandler(reqMappings) {
if (!(this instanceof SafeRequestHandler)) {
return new SafeRequestHandler((reqMappings));
}
mappings = reqMappings;
}
function safeHandleReq(req, res) {
try {
let pair = _.find(mappings, {'url': req.url});
return pair.handler(req, res);
} catch (err) {
console.log(err);
}
}
SafeRequestHandler.prototype.safe = safeHandleReq;
module.exports = SafeRequestHandler;
但现在,每次我这样做:
var handler = require('../util/safeRequestHandler');
let handlerMappings = [
{
url: def.party_create,
handler: partyCreate
},
{
url: def.party_modify,
handler: partyModify
},
{
url: def.party_get,
handler: partyGet
}
];
var handle = new handler(handlerMappings).safe;
我在SafeRequestHandler
中替换了this.mappings
,例如,它不是一个实例
所以我尝试了ES6方法来定义处理程序:
'use strict';
let _ = require('lodash');
class SafeRequestHandler {
constructor(reqMappings) {
this.mappings = reqMappings;
}
safeHandleReq(req, res) {
try {
let pair = _.find(this.mappings, {'url': req.url});
return pair.handler(req, res);
} catch (err) {
console.log(err);
}
}
}
并将其实例化为:
let handlerMappings = [
{
url: def.party_create,
handler: partyCreate
},
{
url: def.party_modify,
handler: partyModify
},
{
url: def.party_get,
handler: partyGet
}
];
let handle = new SafeRequestHandler(handlerMappings).safeHandleReq;
…但这样我甚至无法在safeHandleReq(…)
中找到映射<代码>此
未定义,映射
未定义
我想我只是不完全理解基本原理,所以你能纠正并解释这两种方法的错误吗
谢谢 您的第一个代码创建了一个全局变量,因此只有一个值。你也可以在那里使用这个:
let _ = require('lodash');
function SafeRequestHandler(reqMappings) {
if (!(this instanceof SafeRequestHandler)) {
return new SafeRequestHandler((reqMappings));
}
this.mappings = reqMappings;
}
SafeRequestHandler.prototype.safeHandleReq = function(req, res) {
try {
let pair = _.find(this.mappings, {'url': req.url});
return pair.handler(req, res);
} catch (err) {
console.log(err);
}
}
module.exports = SafeRequestHandler;
如果将特定类实例的
方法
存储到变量中,则会丢失上下文
//句柄没有指向其上下文的指针(也称为this)
让handle=新的SafeRequestHandler(handlerMappings);
//因此handle()将输出无法读取未定义的属性映射
将其更改为:
const instance=新的SafeRequestHandler(handlerMappings);
常量句柄=(…args)=>instance.safeHandleReq(…args);
这里的进一步信息:不,ES6方法应该可以很好地工作。。我找不到“映射”,一切都是未定义的没有,很好。你会遇到什么错误?TypeError:无法读取未定义的属性“mappings”.我得到了:/@greengold然后有一些linter/等。你的代码做了非常糟糕的事情:/相信我,我是最小的,我不使用linter这样的东西。我唯一担心的是我在7.7.3上混合了ES5和ES6。。。已经为此花费了数小时:(