用nodejs封装继承对象的属性

Encapsulating properties of inherited objects with nodejs

本文关键字:属性 对象 继承 nodejs 封装      更新时间:2023-09-26

我在node.js中编写API(我是js的n00b)。我有一个父资源方法,我想为每个特定的资源扩展干我的代码。这是我的

resource.js:

function Resource(model) {
   this.Model = model;
};

Resource.prototype.getAll = function(req, res) {
   this.Model.find(req.query).exec(function(err, all) {
      ...
   };
};
module.exports = Resource;

user.js:

var mongoose = require("mongoose"),
   inherits = require('util').inherits,
   Model = require('./resource.js'),
   UserModel = mongoose.model('User');;
function User() {
   Model.call(this, UserModel);
};
inherits(User, Model);
module.exports = new User();

artist.js

var mongoose = require("mongoose"),
   inherits = require('util').inherits,
   Model = require('./resource.js'),
   ArtistModel = mongoose.model('Artist');
function Artist() {
   Model.call(this, ArtistModel);
};
inherits(Artist, Model);
module.exports = new Artist();

然后在我的路线:

var UserResource = require('./user2.js'),
   ArtistResource = require('./artist2.js');
app.get('/api/user', UserResource.getAll);

当我尝试点击/api/user时,当它试图调用this.Model.find()时,我得到一个未定义的错误。

我还尝试在resource.js中设置一个全局模型变量,但当它调用require('./artist2.js')

时,它会被覆盖

我如何获得类似于更多OO语言的封装…或者更好的是,在JavaScript中推荐的方法是什么?我希望能够通过做一些预处理来扩展子函数,然后调用父函数。

我认为问题可能是当你传递这样一个方法作为回调:

app.get('/api/user', UserResource.getAll);

这最终传递了一个对方法的引用,但随后该方法在没有对象引用的情况下被调用,因此this指针没有适当设置。

就像这样:

var f = UserResource.getAll;
f();

这最终调用getAll()没有任何对象引用,所以this指针不设置为该对象。

有几种方法可以解决这个问题,但最简单的可能是像这样使用.bind():
app.get('/api/user', UserResource.getAll.bind(UserResource));

这将创建一个小函数存根,然后实际调用UserResource.getAll(),而不仅仅是调用getAll(),并通过回调将方法绑定到适当的对象,从而适当地设置this指针。

当你传递一个方法作为回调,并且需要在适当对象的上下文中调用它时(这几乎总是方法的情况),必须这样做。