【问题标题】:Javascript Proper Class constructorJavascript 正确类构造函数
【发布时间】:2014-03-08 23:22:24
【问题描述】:

我正在尝试创建一个在其构造函数中使用一些辅助函数的类。有没有办法将这些助手移动到原型中?问题是构造函数对数据库进行了一些异步调用,我需要在回调函数中调用应用程序,以便在检索到数据后继续执行。

我想将东西移到原型中,因为如果我理解正确,这些函数不会绑定到单个对象,所以如果我有多个对象,它们仍然会调用相同的代码但具有不同的上下文。

   Class = function(id, callback) {
    var that = this,
        addCore = function(err, model) {
            that.id = model._id
            that.core = model
            callback(err, that)
        },
        addTopology = function() {

        }

    if (arguments.length === 2) {
        gameOps.findById(id, addCore)
    } else {
        callback = id
        gameOps.create(addCore)
    }
}

Class.prototype = {
  addPlayer: function(player, callback) {
    gameOps.addPlayer(player, this.model, callback)
  }
}

【问题讨论】:

    标签: javascript constructor


    【解决方案1】:

    我想将东西移到原型中,因为如果我理解正确,这些函数不会绑定到单个对象,所以如果我有多个对象,它们仍然会调用相同的代码但具有不同的上下文。

    是的。但是,这不是您想要的:异步回调需要绑定到特定实例。

    如果您不希望构造函数周围有太多东西,您可能会重新考虑您的设计:

    function Class(model) {
        this.id = model._id;
        this.core = model;
    }
    Class.prototype.addPlayer = function(player, callback) {
        gameOps.addPlayer(player, this.model, callback);
    };
    Class.fromDatabase = function(id, callback) {
        function addCore(err, model) {
            if (err)
                callback(err);
            else
                callback(null, new Class(model))
        }
        function addTopology() {
        }
    
        if (arguments.length === 2) {
            gameOps.findById(id, addCore)
        } else {
            callback = id
            gameOps.create(addCore)
        }
    }
    

    【讨论】:

    • 很好,但是现在如何将回调传递给构造函数?
    • 好的,我明白了,只是有点棘手。所以我通过调用 Class.fromDatabase 创建了一个类,然后我将我的对象作为回调的第二个参数取回?
    • 是的,完全正确。该实例不会立即创建,但仅可用于回调。它更干净,因为您没有未初始化的实例,并且提倡更好的异步编程。它还可以很好地转化为 Promise 抽象。
    • 另外,new Class(model) 会在调用回调之前返回吗?我的意思是js中的简单调用是按顺序执行的吧?
    • 是的,它会的。新创建的实例将作为参数传递。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2020-10-07
    • 2012-01-20
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多