本质上,我想包装(而不是扩展)一个函数,但包装器应像该函数一样可调用。我可以使用一个函数(示例1或2)来执行call
函数。
我的问题是为什么我不能只复制call
函数(示例3)?如果执行此操作,则会收到错误 Function.prototype.call在不兼容的对象上调用
function FunctionWrapper( description, functionReference ) {
this.description = description;
/* 1 */ this.call = function( thisArg ) { functionReference.call( thisArg ) };
/* 2 */ this.call = thisArg => functionReference.call( thisArg );
/* 3 */ this.call = functionReference.call;
}
function StringHolder( string ) {
this.string = string;
}
StringHolder.prototype.log = function() {
console.log( this.string );
};
let logger = new FunctionWrapper( "This is a logger", StringHolder.prototype.log );
logger.call( new StringHolder( "bar" ) );
答案 0 :(得分:2)
#3的问题是this
中的call
是错误的。在#1和#2中,this
中的call
是functionReference
(传递给FunctionWrapper
的函数),但是在#3中,this
是{{1 }}实例,而不是FunctionWrapper
。 functionReference
期望call
是一个函数对象,但是您的this
不是函数,这就是为什么它会给您该错误消息的原因。 How does the "this" keyword work?中的更多内容。
如果您希望FunctionWrapper
工作,则需要执行以下一项操作:
使用logger.call( new StringHolder( "bar" ));
,例如:
bind
this.call = functionReference.call.bind(functionReference);
,并提供使用它的自己的functionReference
。旁注:请不要忘记call
的对应对象apply
。 :-)