此范围因继承而丢失

This scope lost with inheritance

本文关键字:继承 范围      更新时间:2023-09-26

这是示例代码,两个文件和"类"。

具有已定义方法的 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"(无论如何调用.listthis都将永久绑定到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]