Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在sinon js中使用析构函数时存根函数不起作用?_Javascript_Node.js_Ecmascript 6_Destructuring - Fatal编程技术网

Javascript 为什么在sinon js中使用析构函数时存根函数不起作用?

Javascript 为什么在sinon js中使用析构函数时存根函数不起作用?,javascript,node.js,ecmascript-6,destructuring,Javascript,Node.js,Ecmascript 6,Destructuring,有很多人面临着使用sinon.js的存根函数在使用析构函数时不起作用的问题,上面提到了一个很好的解释。 正如答案中提到的,当使用析构函数时,我们总是调用原始函数: const stub = (o, method) => (o[method] = () => "I am a stub"); const obj = { methodFoo() { return "I am foo"; } }; // same as doing `const methodFoo = o

有很多人面临着使用sinon.js的存根函数在使用
析构函数时不起作用的问题,上面提到了一个很好的解释。
正如答案中提到的,当使用析构函数时,我们总是调用原始函数:

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.log("obj.methodFoo(): ", obj.methodFoo());
console.log("methodFoo()", methodFoo());

console.log("Stubbing out method!");
stub(obj, "methodFoo");

console.log("obj.methodFoo: ", obj.methodFoo());
console.log("methodFoo()", methodFoo());

我搜索了一个答案,为什么
析构函数
会覆盖
存根
,或者它如何在引擎盖下工作,以了解如何操作数据,但我没有找到任何解决方案。是否有关于此问题的详细信息?

存根覆盖了methods属性。如果你举这个人为的例子:

 const obj = { prop: "value" };

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

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

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

然后它可能会变得更清晰。将方法视为可以复制的值(实际上复制了对它们的引用)。

存根覆盖了methods属性。如果你举这个人为的例子:

 const obj = { prop: "value" };

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

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

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

然后它可能会变得更清晰。将方法视为可以复制的值(实际上,对它们的引用会被复制)。

JavaScript使用按值分配/复制<代码>常量{methodFoo}=obj
obj.methodFoo
必须的值的副本分配给
methodFoo
,该值是对函数的引用。此后,对
obj.methodFoo
的任何更改都不会影响变量
methodFoo
。但这并不是特定于分解结构。这就是JS中赋值、变量和值的工作方式。这里有一个非常简单的例子:
var-obj={foo(){console.log('foo');};var-method=obj.foo;obj.foo=()=>console.log('bar');method();
@FelixKling非常感谢。JavaScript使用按值赋值/复制。
const{methodFoo}=obj;
obj.methodFoo
必须的值的副本分配给
methodFoo
,该值是对函数的引用。此后,对
obj.methodFoo
的任何更改都不会影响变量
methodFoo
。但这并不特定于解构。JS.H中的赋值、变量和值就是这样工作的这里有一个非常简单的例子:
var-obj={foo(){console.log('foo');};var-method=obj.foo;obj.foo=()=>console.log('bar');method();
@FelixKling非常感谢。