此范围因继承而丢失
This scope lost with inheritance
这是示例代码,两个文件和"类"。
具有已定义方法的 CRUD 类,此问题发生在 this.modelName 上,因为我设置了使用此代码更改此上下文的路由:
问题是,如何在定义模型名称的 CRUD 下获得相同的范围?
server.get('/users/:id', UserRoutes.find);
法典:
var db = require('../models');
function CRUD(modelName) {
this.modelName = modelName;
this.db = db;
}
CRUD.prototype = {
ping: function (req, res, next) {
res.json(200, { works: 1 });
},
list: function (req, res, next) {
// FAILS BECAUSE the modelName is undefined
console.log(this);
db[this.modelName].findAll()
.success(function (object) {
res.json(200, object);
})
.fail(function (error) {
res.json(500, { msg: error });
});
}
};
module.exports = CRUD;
用户路由类:
var CRUD = require('../utils/CRUD'),
util = require('util');
var UserModel = function() {
UserModel.super_.apply(this, arguments);
};
util.inherits(UserModel, CRUD);
var userRoutes = new UserModel('User');
module.exports = userRoutes;
我假设您在其他地方使用 userRoutes.list
作为处理程序,即上下文更改。在这种情况下,这应该是一个简单的解决方案:
function CRUD(modelName) {
this.modelName = modelName;
this.db = db;
this.list = CRUD.prototype.list.bind(this);
}
请注意,您将无法使用该解决方案访问"其他this
"(无论如何调用.list
,this
都将永久绑定到CRUD
实例)。
另一种选择是将list
转换为函数生成器(这与.bind
的作用几乎相同,只是您仍然可以使用其他上下文中的this
):
CRUD.prototype = {
// some code
list: function() {
var that = this;
return function (req, res, next) {
console.log(that);
db[that.modelName].findAll()
.success(function (object) {
res.json(200, object);
})
.fail(function (error) {
res.json(500, { msg: error });
});
}
}
};
然后使用 userRoutes.list()
作为处理程序。
这种事情通常是通过将正确的this
存放到_this
中来解决的。在列表中,函数this
是函数对象,它没有 modelName 对象。
var _this;
function CRUD(modelName) {
this.modelName = modelName;
this.db = db;
_this = this // <---------------
}
....
// call the _this in the outer scope
db[_this.modelName]
相关文章:
- 正在全局范围中查找JavaScript函数
- 如何通过数组更新角度子范围
- 如何使用ngrepeat和双向绑定获得指令的隔离范围
- 从控制器继承了隔离的作用域以生成可重用的指令
- HTML范围:动态设置值属性
- "实例范围”;TypeScript类的getter/setter
- jquery日期选择器年份范围默认值
- 无法在我的示例plunker中使用继承/隔离的范围概念
- 我怎样才能创建一个函数expr;t继承词法范围
- JavaScript继承:未捕获的范围错误:超过了最大调用堆栈大小
- 属性内的角度指令范围继承
- 为什么允许通过原型继承访问另一个闭包范围内的私有变量
- 此范围因继承而丢失
- ng-重复范围问题:两级继承
- AngularJS指令范围继承
- 混淆了 AngularJS 中指令之间的范围继承
- 指令/继承范围
- Angular js的控制器范围继承
- AngularJS范围继承解释
- 角度指令 - 我可以从父级继承隔离范围吗?