用nodejs封装继承对象的属性
Encapsulating properties of inherited objects with nodejs
我在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
指针。
当你传递一个方法作为回调,并且需要在适当对象的上下文中调用它时(这几乎总是方法的情况),必须这样做。
相关文章:
- 为什么我可以在Array属性对象中找到Javascript Array for Each方法
- 使用onclick调用属性对象函数
- 嵌套为..in 循环,列出多维对象的属性(对象)
- 动态属性对象 - JSON
- 在不使用隔离范围angularjs自定义指令的情况下获取属性对象
- 通过属性传递属性/对象.Javascript
- Javascript:属性/对象的类型
- 访问JSON中的属性(对象)
- 属性对象Javascript不是用Jquery Deferred设置的
- 无法读取属性'#<对象>'未定义的获取错误
- Twitter中多属性对象的子字符串匹配
- 无法设置'data'属性'对象'标记.(只IE8)
- 更新数据属性对象属性值
- 将属性对象的选定对象从原型推入数组
- 将单个属性对象字面量的数组转换为仅包含其值的数组的最佳方法
- 寻找一种更简单的方法来检查是否多个属性&对象中的方法是未定义的
- 主干模型:带有get方法的空属性,但在属性对象中
- 如何赋值给"text"someText"属性对象在动能js
- Angularjs的数据绑定与数据属性对象
- 如何将一个嵌套的javascript对象转换为只有一级属性对象