簡體   English   中英

嵌套對象內的函數調用失敗

[英]Function call from within nested object failing

在下面的代碼中,我希望通過構造函數提供泛型函數。 該對象用於處理對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'
};

如果將通用函數移出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'
};

除了已經說過的同時也被接受了,您甚至可以更進一步,為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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM