作为一种禁用功能的方法,我想到了使用一些如下所示的javascript的想法:

//fakefrob.js
var frob = function () {
    return {
        myFunc: function(){},
        myFunc1: function(){},
        myFunc2: function(){return 2;},
        myFunc3: function(){},
        myFunc4: function(){}
    };
}();

在此示例中,实际的frob具有这些功能的实现。显然这是一个hack(函数通常不执行任何操作或具有占位符返回值)。如果将foobar添加到realfrob.js,则必须将foobar的空实现添加到fakefrob.js。有没有一种方法(理想情况下无需使用库)来编写fakefrob.js,从而将像foobar一样的frob.foobar行为定义为function(){};,而无需将foobar实际添加到fakefrob.js中?

最佳答案



您的意思是,将所有属性映射到无操作功能?不,JavaScript(目前)根本不具备所有功能。 (我相信正在考虑针对它们的某种机制,作为某些阶段出现的代理问题的一部分。)

但是,如果您可以访问代码中的实际frob,则可以完全自动生成fakefrob:

// Assumes `frob` already exists
(function() {
    var mock;
    var name;

    // Build the mock, with a function for each function
    // on the real object.
    mock = {};
    for (name in frob) {
        if (typeof frob[name] === "function") {
            mock[name] = function() { };
        }
    }

    // Replace the original
    frob = mock;
})();

当然,如果您要复制非功能属性,则可以同时执行。

请注意,我有意在上面的循环中不包括hasOwnProperty,因为我假设即使frob从原型(prototype)继承了它们,您也希望您的模拟包括函数。

如果frob继承了某些函数,并且您希望您的模拟对它们表现出与原始frob相同的hasOwnPropety行为,则可以提高创意:
// Assumes `frob` already exists
(function() {
    var mock;
    var mockProto;
    var name;

    function FakeFrob() {
    }

    mockProto = FakeFrob.prototype;

    // Build the mock, with a function for each function
    // on the real object.
    mock = new FakeFrob();
    for (name in frob) {
        if (typeof frob[name] === "function") {
            if (frob.hasOwnProperty(name)) {
                mock[name] = function() { };
            }
            else {
                mockProto[name] = function() { };
            }
        }
    }

    // Replace the original
    frob = mock;
})();

现在,如果原始的frob具有自己的foo(frob.hasOwnProperty("foo")true)但继承了bar(frob.hasOwnProperty("bar")false),则模拟中的hasOwnProperty会说完全相同的事情。

07-24 19:02