Почему заглушенные функции не работают при использовании деструктора с sinon js?

Многие люди сталкиваются с проблемой заглушки функций, когда 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 или как это работает под капотом, чтобы понять, как манипулировать данными, но не нашел никакого решения. Есть подробности по этому вопросу?

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();

Felix Kling 13.06.2019 00:40

@FelixKling Большое спасибо.

Slim 13.06.2019 00:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
138
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Заглушка переопределяет свойство методов. Если взять этот надуманный пример:

 const obj = { prop: "value" };

 const prop = obj.prop; // or { prop } = obj;

 obj.prop = "new value"; // stub()

 console.info(prop); // "value"

тогда может станет понятнее. Думайте о методах как о значениях, которые можно копировать (на самом деле копируется ссылка на них).

Другие вопросы по теме