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