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