Javascript Promise.resolve对象不是构造函数

Javascript Promise.resolve对象不是构造函数,javascript,ecmascript-6,promise,Javascript,Ecmascript 6,Promise,我有一个对象有两种方法。 foo.publicMethod()将在内部调用foo.privateMethod() 例如: foo.prototype.publicMethod = function() { return this.privateMethod() .then(/* Do some other stuff */); }; 为了单独测试public方法,我对private方法进行了存根,使其返回一个空的承诺。 由于某种原因,如果我指定 foo.privateM

我有一个对象有两种方法。
foo.publicMethod()
将在内部调用
foo.privateMethod()

例如:

foo.prototype.publicMethod = function() { 
   return this.privateMethod()
       .then(/* Do some other stuff */); 
};
为了单独测试public方法,我对private方法进行了存根,使其返回一个空的承诺。 由于某种原因,如果我指定

foo.privateMethod = () => Promise.resolve();
不管你怎么做,一切都很顺利

foo.privateMethod = Promise.resolve;
生成错误消息:
TypeError:对象不是构造函数


我看不出这两行代码如何产生不同的结果。是的,从技术上讲,一个是包装
承诺。解决
一次,但我不认为这会对最终结果产生什么影响。你知道有什么不同吗?

这两个不完全一样。在工作版本中,
resolve
调用的上下文是
Promise
对象。在第二个版本中,上下文是调用
privateMethod
时使用的任何上下文,当您将其称为
foo.privateMethod()
时,它将是
foo

要确保使用第二种语法正确设置了上下文,请使用:

函数Foo(){}
Foo.prototype.publicMethod=function(){
返回此.privateMethod();
};
var foo=new foo();
foo.privateMethod=Promise.resolve.bind(Promise);
//测试一下

foo.publicMethod()。然后(=>console.log('done')这只是猜测,但在代码的某个地方,您可能会覆盖
foo
,您首先将其定义为构造函数,然后使用实例覆盖它

我的猜测是基于您如何使用
foo
,首先您分配给它的原型

foo.prototype.publicMethod = ...
但突然间,它成了一个例子

foo.privateMethod = ...
而人们会期望

foo.prototype.privateMethod = ...
如果稍后您尝试使用
foo
,这是一个实例,因为它是一个构造函数:

var f = new foo(); // foo is not a constructor function

但是,查看导致问题的确切行可能会有所帮助,您在两个版本中显示的作业不能仅以您发布的错误消息结束。

生成错误消息-何时?哪里这一行本身不是错误。它总是
未定义的
,因为
解析
是在严格模式下定义的。它不一定是未定义的,如果他们正在执行
foo.privateMethod()
,那么
这个
将是
foo
var f = new foo(); // foo is not a constructor function