我有一个有两种方法的对象。
foo.publicMethod()
将在内部致电foo.privateMethod()
。
例如:
foo.prototype.publicMethod = function() {
return this.privateMethod()
.then(/* Do some other stuff */);
};
为了单独测试公共方法,我通过使私有方法返回一个空的promise来存根。 出于某种原因,如果我指定
foo.privateMethod = () => Promise.resolve();
一切都很好,无论如何做
foo.privateMethod = Promise.resolve;
会产生错误消息:TypeError: object is not a constructor
我看不出这两行代码会产生不同的结果。是的,一个在技术上包装Promise.resolve
一次,但我不知道这应该如何影响最终结果。任何想法有什么不同?
答案 0 :(得分:6)
两者并不完全相同。在工作版本中,resolve
调用的上下文是Promise
对象。在第二个版本中,上下文是调用的任何上下文privateMethod
,当您将其称为foo
时,它将是foo.privateMethod()
。
要确保使用第二种语法正确设置了上下文,请使用bind
:
foo.privateMethod = Promise.resolve.bind(Promise);
function Foo() {}
Foo.prototype.publicMethod = function() {
return this.privateMethod();
};
var foo = new Foo();
foo.privateMethod = Promise.resolve.bind(Promise);
// Test it
foo.publicMethod().then ( _ => console.log('done'));

答案 1 :(得分:-1)
这只是一个猜测,但在你的代码中你可能会覆盖foo
,你首先将它定义为构造函数,然后用实例覆盖它。
我的猜测是基于你如何使用foo
,首先分配给它的原型
foo.prototype.publicMethod = ...
然后突然间它是一个实例
foo.privateMethod = ...
虽然人们会期待
foo.prototype.privateMethod = ...
如果某个地方以后你尝试使用foo
,这是一个实例,因为它是一个构造函数:
var f = new foo(); // foo is not a constructor function
然而,查看导致问题的确切行可能会有所帮助,您在两个版本中显示的作业不能以您发布的错误消息结束。