【问题标题】:Function call from within nested object failing嵌套对象内的函数调用失败
【发布时间】:2017-01-28 14:57:48
【问题描述】:

在下面的代码中,我想通过构造函数使泛型函数可用。该对象用于处理对 API 的调用。但是如果我从 events.POST 调用 this._isEmpty(obj) 它总是返回 false。放置 _isEmpty() 函数的主体确实会产生所需的结果。我该如何解决这个问题? 当然,欢迎任何有关改进此结构的提示。 我在 SO 上查找了一些类似的问题,但我发现的问题/答案没有类似的嵌套。

我打了以下电话:

var assystBridge = new global.assystBridge();
response.setStatus(assystBridge.events.POST(request, response));

对象:

var assystBridge = Class.create();
assystBridge.prototype = {
    initialize: function() {
        // Generic functions go here
        function _isEmpty(obj){
            // Checks whether an object has properties
            // Used for checking whether any data was posted or not
            // Returns true or false
            return Object.keys(obj).length === 0;
        }
    },
    events: {
        POST: function(request, response){
            var data = request.body.data;
            var responseText = '';
            if(this._isEmpty(data)){
            //if(Object.keys(data).length === 0){   
                response.setBody({"response":"NO data was posted", "data": data});
                return 400;
            } else {
                return 201;
            }

        },
        GET: function(request, response){

        },
        DELETE: function(request, response){

        }
    },
    type: 'assystBridge'
};

【问题讨论】:

  • 如何调用events.POST?你实例化 assystBridge 类然后调用 instance.events.POST 吗?我问是为了在你调用它时确定 events.POST 中“this”的含义。
  • 更新问题
  • 我很惊讶你在调用 response.setStatus(assystBridge.events.POST(request, response)); 时没有收到错误消息。如果不知何故 assystBridge 没有从其他地方继承 _isEmpty 函数,则代码应该正常损坏,因为它的编写方式 _isEmpty 不是类或原型的成员,它只是初始化方法的私有。
  • 它在Java后端,使用Rhino实现JS接口。它有一些怪癖,所以你的评估是正确的

标签: javascript function object scope


【解决方案1】:

如果您将泛型函数移出initialize() 方法并使其成为原型的属性之一,那么您可以通过assystBridge.prototype._isEmpty() 引用它。

例如:

assystBridge.prototype = {
    _isEmpty: function(obj) {
        // Checks whether an object has properties
        // Used for checking whether any data was posted or not
        // Returns true or false
        return Object.keys(obj).length === 0;
    },
    events: {
        POST: function(request, response){
            var data = request.body.data;
            var responseText = '';
            if(assystBridge.prototype._isEmpty(data)){
                response.setBody({"response":"NO data was posted", "data": data});
                return 400;
            } else {
                return 201;
            }

        },
    },
    type: 'assystBridge'
};

【讨论】:

  • 所以我创建了一个顶级属性 genericFunctions 来保存所有通用函数,并将 var gf = assystBridge.prototype.genericFunctions 添加到 events.POST。现在 gf._isEmpty() 工作。谢谢!
【解决方案2】:

除了已经说过并同时也被接受的内容之外,您甚至可以更进一步,为assystBridge 创建一个工厂,从而更好地控制适当地处理函数范围...

var createAssystBridge = (function () { // - immediately invoked function expression
                                        //   acting as a generator for a factory that
                                        //   will be returned, thus creating a closure ...

    // ... due to shared code, that will be preserved within this closure.

    function isEmpty(obj) {
        // Checks whether an object has properties
        // Used for checking whether any data was posted or not
        // Returns true or false
        return Object.keys(obj).length === 0;
    }

    function postData(request, response) {
        var data = request.body.data;
        var responseText = '';
        if (isEmpty(data)){
            response.setBody({"response":"NO data was posted", "data": data});
            return 400;
        } else {
            return 201;
        }
    }
    function getData(request, response) {

    }
    function deleteData(request, response) {

    }

    function initializeAssystBridge() {

    }

    // returning the factory

    return function assystBridgeFactory() {
        var
            assystBridge = Class.create();
          //assystBridge = Object.create({});

        assystBridge.prototype = {              //  - assign shared code
            initialize: initializeAssystBridge, //    with every call
            events: {                           //    of this factory.
                POST    : postData,             //
                GET     : getData,              //
                DELETE  : deleteData            //
            },
            type: 'assystBridge'
        };
        return assystBridge;
    };

}());

var assystBridge = createAssystBridge();

【讨论】:

  • 非常有趣。我会试一试。 tnx!
猜你喜欢
  • 2017-12-17
  • 1970-01-01
  • 2017-06-21
  • 2019-12-16
  • 1970-01-01
  • 2023-01-14
  • 2014-03-04
  • 2022-11-13
  • 2012-08-28
相关资源
最近更新 更多