Многие люди сталкиваются с проблемой заглушки функций, когда sinon.js не работает при использовании destructor, и в Функция-заглушка Sinon, используемая с деструктурированием упоминается отличное объяснение.
И, как упоминалось в ответе, при использовании деструктора мы всегда вызываем исходную функцию:
const stub = (o, method) => (o[method] = () => "I am a stub");
const obj = {
methodFoo() {
return "I am foo";
}
};
// same as doing `const methodFoo = obj.methodFoo;`
const { methodFoo } = obj; // "import" using destructuring
console.info("obj.methodFoo(): ", obj.methodFoo());
console.info("methodFoo()", methodFoo());
console.info("Stubbing out method!");
stub(obj, "methodFoo");
console.info("obj.methodFoo: ", obj.methodFoo());
console.info("methodFoo()", methodFoo());
Я искал ответ, почему destructor переопределяет stub или как это работает под капотом, чтобы понять, как манипулировать данными, но не нашел никакого решения. Есть подробности по этому вопросу?
@FelixKling Большое спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Заглушка переопределяет свойство методов. Если взять этот надуманный пример:
const obj = { prop: "value" };
const prop = obj.prop; // or { prop } = obj;
obj.prop = "new value"; // stub()
console.info(prop); // "value"
тогда может станет понятнее. Думайте о методах как о значениях, которые можно копировать (на самом деле копируется ссылка на них).
JavaScript использует назначение/копирование по стоимости.
const { methodFoo } = obj;присваивает копию значения, котороеobj.methodFooимеет,methodFoo, которое является ссылкой на функцию. После этого любые изменения вobj.methodFooне повлияют на переменнуюmethodFoo. Однако это не относится к деструктуризации. Вот как присваивание, переменные и значения работают в JS. Вот более простой пример:var obj = {foo() { console.info('foo'); }; var method = obj.foo; obj.foo = () => console.info('bar'); method();