nodejs 中模块 functions/classes 的实例
instances of module functions/classes in nodejs
我有一个项目是从 ES5.1 开始的,后来我将其更改为支持 ES6,所以我使用了 async-await,让...
现在我需要 module/object 类似实例。
我发现 this post 解释了这个过程,但是...
当我这样做时:
'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(...)
中联系到 mappings
。 this
未定义,mappings
未定义
我想我只是没有完全理解基本原理,所以请您更正并解释这两种方法有什么问题吗?
谢谢!
您的第一个代码创建了一个全局变量,因此只有 一个 值。您也可以在那里使用 this:
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;
如果将特定 class 实例的 method
存储到变量中,您将丢失上下文。
// handle doesn't have a pointer to its context (aka, this)
let handle = new SafeRequestHandler(handlerMappings).safeHandleReq;
// so handle() will output cannot read property mappings of undefined
改为:
const instance = new SafeRequestHandler(handlerMappings);
const handle = (...args) => instance.safeHandleReq(...args);
这里有更多信息:
我有一个项目是从 ES5.1 开始的,后来我将其更改为支持 ES6,所以我使用了 async-await,让...
现在我需要 module/object 类似实例。
我发现 this post 解释了这个过程,但是...
当我这样做时:
'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(...)
中联系到 mappings
。 this
未定义,mappings
未定义
我想我只是没有完全理解基本原理,所以请您更正并解释这两种方法有什么问题吗?
谢谢!
您的第一个代码创建了一个全局变量,因此只有 一个 值。您也可以在那里使用 this:
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;
如果将特定 class 实例的 method
存储到变量中,您将丢失上下文。
// handle doesn't have a pointer to its context (aka, this)
let handle = new SafeRequestHandler(handlerMappings).safeHandleReq;
// so handle() will output cannot read property mappings of undefined
改为:
const instance = new SafeRequestHandler(handlerMappings);
const handle = (...args) => instance.safeHandleReq(...args);
这里有更多信息: