从回调访问对象的属性

Access an object's property from a callback

本文关键字:属性 对象 访问 回调      更新时间:2023-09-26

在我的 Node.js 脚本中,我需要从回调访问对象的属性(这里是"模型"对象的属性"错误")。我看到无法编辑此属性,但我需要它来抛出错误并停止脚本(如果"error"属性具有值,则"construct"函数返回 false,错误将在脚本的另一部分抛出)。

var underscore = require('underscore');
var mysql = require('mysql');
var baseConfig = require('../config/base');
var autoload = require('../autoload');
var core = autoload.load(baseConfig.dirs.core);
module.exports = {
    name: 'model',
    database: null,
    error: null,
    construct: function(host, user, password, database, res) {
        var connection = mysql.createConnection({
            host: host,
            user: user,
            password: password,
            database: database
        });
        connection.connect(function(error) {
            if(error) this.error = error;
        });
        this.database = connection;
        if(this.error) return false;
    },
    extend: function(child) {
        return underscore.extend(this, child);
    }
}

我真的很想知道如何编辑此属性,因为我还没有找到解决方案。谢谢。

您对"this"有词法范围问题。 在传递给连接方法的回调函数中,"this"的作用域是当前正在执行的函数,而不是正在构建的对象。 我已经重新构建了您的代码,以便您可以访问您尝试访问的属性......还进行了重组以实现适当的原型继承,消除了对扩展方法的需求......在下面添加了一个示例

请参阅此线程: https://stackoverflow.com/a/32025281/2665925

参考 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

var underscore = require('underscore');
var mysql = require('mysql');
var baseConfig = require('../config/base');
var autoload = require('../autoload');
var core = autoload.load(baseConfig.dirs.core);
var dbConfigObj = {
        host: 'localhost',
        user: 'user',
        password: '12345',
        database: 'CarDB'
    }
function DBConnector(config, res){
    var objectScope = this;
    var connection = mysql.createConnection(config);
    connection.connect(function(error) {
        if(error) objectScope.error = error;
    });
    this.database = connection;
    if(objectScope.error) return false;    
}
DBConnector.prototype = {
    name: 'model',
    database: null,
    error: null,
    extend: function(child) {
        return underscore.extend(this, child);
    }
}
DBConnector.prototype.constructor = DBConnector; 
function CarModel(){
    DBConnector.call(this, dbConfigObj);
}
CarModel.prototype = Object.create(DBConnector.prototype,{
    color: {
        value: null //default value,
        writable: true,  
        configurable:true,
    }
})
CarModel.prototype.constructor = CarModel
module.exports = CarModel