创建一个什么都没做的Javascript对象

Bri*_*ian 3 javascript mocking

作为一种有点滥用功能的hacky方法,我提出了使用这样的一些javascript的想法:

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

在这个例子中,真正的frob具有这些功能的实现.显然这是一个hack(函数大多数什么都不做或者有占位符返回值).如果我将foobar添加到realfrob.js,我必须将一个空的foobar实现添加到fakefrob.js.是否有一种方法(理想情况下不使用库)来编写fakefrob.js,frob.foobar像foobar 这样的行为被定义为function(){};,而没有实际添加foobar到fakefrob.js?

T.J*_*der 7

是否有一种方法(理想情况下不使用库)来编写fakefrob.js,frob.foobar像foobar 这样的行为被定义为function(){};,而没有实际添加foobar到fakefrob.js?

你的意思是,一个catch-all属性,映射到无操作函数?不,JavaScript(目前)根本没有捕获所有属性.(我相信他们一些机制正在考虑,作为代理的东西灌进派克在某个阶段的一部分.)

但是,如果您可以访问frob代码中的real ,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;
})();
Run Code Online (Sandbox Code Playgroud)

当然,如果要复制非功能属性,可以同时执行此操作.

请注意,我故意没有包括hasOwnProperty在上述循环,因为我想你想你的模拟,包括功能,即使frob从原型继承他们.

如果frob继承了某些函数,并且您希望您的模拟hasOwnPropety对它们展现与原始frob 相同的行为,则可以获得更多创意:

// 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;
})();
Run Code Online (Sandbox Code Playgroud)

现在,如果原来frob有自己的foo(frob.hasOwnProperty("foo")true)但是继承bar(frob.hasOwnProperty("bar")false),hasOwnProperty你的模拟就会说完全相同的东西.