Node.jsinheritance
我正在用hapijs使用节点来做一个REST API。 所以,我必须使用inheritance,我没有成功访问父亲的function。 我有这个:
controller.js
var __ = require('underscore'); var Controller = function(){ var Validator = require('../validators/'+this.controller); Controller.prototype.validate = new Validator(); } Controller.prototype.returnErrors = function(err){ var errors = []; __.each(err, function(error){ errors.push(error.message); }); return errors; } module.exports = Controller;
reckon.js
var __ = require('underscore'), reckon = require('../components/reckon'), inherits = require('util').inherits, Controller = require('./controller'), Reckon = require('../models/reckon').Reckon; var ReckonCtr = function() { this.controller = "reckon"; ReckonCtr.super_.call(this); } inherits(ReckonCtr, Controller); ReckonCtr.prototype.get = function (request, reply, server, callback) { this.validate.get(__.extend({company:request.params.company}, request.query), function(validation, value){ if(validation.error){ return callback(this.returnErrors(validation.error.details)); } reckon.getReckon(request.params.company, request.query, function(error, success){ if(error) return callback(error); return callback(null, success); }); }); } module.exports = new ReckonCtr();
为什么我可以访问“this.validate”,不能“this.returnErrors”? (TypeError:Uncaught error:Object#has no method'returnErrors')。
如何把我的returnErrors私人?
提前致谢
这是一个范围问题。
您可以访问this.validate
因为您在ReckonCtr.prototype.get
方法的上下文中引用该实例。 但是,当您尝试访问this.returnErrors
您将在this.validate.get
的callback的上下文中不再指向该实例。
解决这个问题的最简单,最常见的方法是把这个引用作为局部variables,并且直接引用variables而不是直接引用
ReckonCtr.prototype.get = function (request, reply, server, callback) { var self = this; self.validate.get(__.extend({company:request.params.company}, request.query), function(validation, value){ if(validation.error){ return callback(self.returnErrors(validation.error.details)); } reckon.getReckon(request.params.company, request.query, function(error, success){ if(error) return callback(error); return callback(null, success); }); }); }
this.validate
正在使用的上下文中, this
是指ReckonCtr
对象,所以它的工作原理。 在callback中, this
并不涉及ReckonCtr
。
在给定的上下文中究竟是什么引起的混淆是JavaScript中的一个大问题。 有几个解决scheme。 这个列表毫无疑问是不完整的:
- 在包含callback函数的函数中,使用类似
var self = this;
保存this
的引用var self = this;
然后在callback中使用self
而不是this
。 - 如果您使用的是最新版本的Node,则可以使用粗体箭头语法来使其更具可预测性。
- 使用
bind()
,call()
或apply()
来明确地设置这个值。 - 如果你想要的对象是一个单身人士,只需明确地使用对象而不是
this
。