检查JavaScript中对象内是否存在私有函数

时间:2015-06-08 06:28:17

标签: javascript function object private

如何检查对象内是否存在私有函数?

var myObj = function(){
    var myFunc = function(){};

    var init = function(){
        //has myFunc been defined?
    }
}

我知道我可以这样做:

if (typeof myFunc == 'function') { 
    //myFunc exist
}

但这是在检查全球范围 如何将其限制在我的对象范围内?

以下是我需要的最简化的案例:

var myComponent = function () {
    var exportExcel = function () {

    };
    this.export = function (type) {
        if('export'+type is a private function in this scope){
            window["export"+type]()//but in local scope;
        }
    }
};

这是我现在的工作:

var myComponent = function () {
    var Exports = {
        Excel: function () {

        }
    };

    this.export = function (type) {
        if (Exports.hasOwnProperty(type)) {
            Exports[type]();
        } else {
            alert('This Export type has not been implemented Yet ! or it never will ... how knows? well i don\'t ...');
        }
    }
};

2 个答案:

答案 0 :(得分:1)

你可能已经注意到了:

function myFunc () {};

function myObj () {
    function init () {
        if (myFunc) // passes
    };
}

你可以作弊: - |

function myObj () {
    var isdef = { myFunc: true };
    function myFunc () {};
    function init () {
        if (isdef.myFunc) // do something
    };
}

我想知道为什么会这样做。

答案 1 :(得分:1)

基于给出的额外信息,最实用的模式是您所谓的“临时解决方法”:将您的函数保存在私有对象中,按类型键入。

var myComponent = function () {
    var exporters = Object.create(null, {
        "Excel": function () {
            // do magic export here
        }
    });

    this.export = function (type) {
        if (type in exporters) {
            // defined locally
            return exporters[type].call(this); // binding is optional
        } else {
            // no export for you!
        }
    }
};

这可以防止两件事:

  1. 通过字符串组合引用该函数,
  2. 查询全局范围(或​​实际上,查询组件与全局范围之间的任何范围)。
  3. 这可能不是您的设计原则,您可以进一步扩展此代码以允许添加/删除导出器。