作为一种禁用功能的方法,我想到了使用一些如下所示的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
会说完全相同的事情。