有没有办法(理想情况下不使用库)来编写 fakefrob.js,使得frob.foobar
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
它们是从原型继承的。
如果frob
继承了一些函数并且你希望你的 mock 对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;
})();
现在,如果原件frob
有自己的foo
( frob.hasOwnProperty("foo")
is true
) 但继承的bar
( frob.hasOwnProperty("bar")
is false
),hasOwnProperty
那么在您的模拟中会说完全相同的事情。