在原型方法中使用“this”时丢失的上下文
好的,所以我有一个使用快递的节点应用程序。 在这个应用程序中,我有一个像这样的快速路线:
var MyObj = require('./myObj') , myObj = new MyObj(); app.post('/api/blah', auth.requiresLogin, myObj.method2);
现在在MyObj对象中,我有以下几点:
var MyObj = function(name){ this.name = name; this.message = 'hello'; }; MyObj.prototype = { method1: function(req, res, done){ console.log('In Method 1'); done(null, this.message +' '+this.name); }, method2: function(req, res){ var message; console.log('In Method 2'); this.method1(req, res, function(err, value){ if(err) throw err; message = value; console.log(this.message); }); return message; } }; module.exports = MyObj;
现在,如果我不需要这个对象,并从同一个文件中调用它的作品。 正如这个jsFiddle所示: http : //jsfiddle.net/britztopher/qCZ2T/ 。 但是,如果我需要它,用新的构造,并尝试调用myObj.method2(req, res);
从需求类我得到#<Object> has no method 'method1'
。 不知道我在这里做错了什么,或者如果它expressJS或要求JS给我的问题。 另外,当我在method2中查看时,它是this = global
,所以有些东西正在丢失这个上下文。
当将myObj.method2
方法作为parameter passing给app.post
您并不知道应该执行哪个上下文/作用域。 因此它将在全球范围内执行。 解决scheme应该是myObj.method2.bind(myObj)
。
- instanceof在节点4中评估为真,但不在节点6中评估
- 你应该如何inheritanceEventEmitter节点?
- 创build自定义EventEmitter时是否需要events.EventEmitter.call(this)?
- 为什么我们应该使用Object.create?
- 在Javascript中,为什么Object.getPrototypeOf()返回一个空列表?
- 为什么把方法放在类的原型而不是在构造函数中声明呢?
- 在/从MongoDB中存储和检索JavaScript对象
- 在express.js中实例化的控制器中的“this”的意外值
- JavaScript中的JavaScript原型对象效率