Есть ли способ (в идеале без использования библиотеки) для записи fakefrob.js таким образом, что frob.foobar
действует как Foobar был определен как function(){};
, фактически не добавляя к Foobar fakefrob.js?
Вы имеете в виду свойство catch-all, отображаемое в функцию no-op? Нет, JavaScript не имеет (в настоящее время) свойств catch-all. (Я считаю, что какой-то механизм для них является рассматривается, как часть прокси материала, сходящего щука на каком-то этапе.)
Если у вас есть доступ к реальному 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
наследует некоторые функции и вы хотите ваш макет выставить тот же 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")
- true
), но унаследованный bar
(frob.hasOwnProperty("bar")
- false
), hasOwnProperty
на ваш макет скажет точно такую же вещь.
Обратите внимание, что функция прокси-сервера может принимать исходную цель, если мы хотим генерировать исключения, если имя не существует. – Brian