Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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 为什么不';这些类实现是否具有相同的行为?_Javascript_Function_Call_Metaprogramming - Fatal编程技术网

Javascript 为什么不';这些类实现是否具有相同的行为?

Javascript 为什么不';这些类实现是否具有相同的行为?,javascript,function,call,metaprogramming,Javascript,Function,Call,Metaprogramming,我试图为一个扩展了函数的类编写一个概念证明,以演示一个可以基于另一个函数初始化的函数构造函数,并以以下方式反映这个和参数: 类句柄扩展函数{ 构造函数(函子){ 超级(“函子”,“切片”` “严格使用”; 返回函子 .call(this,…slice.call(arguments,2)); `); 返回this.bind(this,functor,Array.prototype.slice) } } let handle=新句柄(函数测试(){ log(此句柄实例,参数.length) })

我试图为一个扩展了
函数的类编写一个概念证明,以演示一个可以基于另一个函数初始化的函数构造函数,并以以下方式反映
这个
参数

类句柄扩展函数{
构造函数(函子){
超级(“函子”,“切片”`
“严格使用”;
返回函子
.call(this,…slice.call(arguments,2));
`);
返回this.bind(this,functor,Array.prototype.slice)
}
}
let handle=新句柄(函数测试(){
log(此句柄实例,参数.length)
})
log(handle instanceof handle,handle.length)

句柄(1,2,3)
您正在调用
函数。call
函数。prototype.call
)如果没有
这个
,我想使用起来会更正确。不过,它需要一个,因为
this
值就是它调用的函数。这一问题的一个简短示例:

var call = Function.prototype.call;
call();
也许你想打电话。打电话(这个…)

类句柄扩展函数{
构造函数(函子){
超级(“实例”、“调用”、“切片”`
“严格使用”;
return call.call(这个,实例,…slice.call(参数,3));
`);
返回函数.bind
.call(this,functor,this,Function.call,Array.prototype.slice)
}
}
let handle=新句柄(函数测试(){
log(此句柄实例,参数.length)
})
log(handle instanceof handle,handle.length)
手柄(1、2、3)
所以call()函数有点问题

请注意,
call
不是一个函数,而是
call
试图调用的东西

我的理解是,如果call()不是调用表达式的一部分,它的第一个参数将成为被调用的函数


否。被调用的函数始终是
调用
调用的
this
上下文,当
调用
未作为方法调用时,没有任何更改。您需要执行
call.call(functor,context,…args)

寻找一种更简单的方法来扩展
函数。除了强制将其用作构造函数之外,您的
ExtensibleFunction
基本上放弃了实例化的
this
,引用您的话,这似乎是在回避问题,而不是以“令人满意”的方式解决问题。不,这个
不能丢弃,因为当我们不调用
super
时,它永远不会被实例化,我们也不想调用
super
,因为这意味着每次创建实例时都要解析和评估函数源字符串。@Bergi哦,这很有趣。。。我从未意识到导致实例化的是
super()
,我只是认为ES6有一些奇怪的约定,如果扩展类的构造函数是显式的,它必须是第一个?这一直是问题所在?facepalm但是
Function.call
Function.prototype.call
同样有效,因为
Function的instanceof Function
,所以它将有成员方法
call
,作为自身的一个实例。@PatrickRoberts:对;我只是觉得这有误导性,比如传递
{}.toString.call
或其他什么。幸运的是,没有必要,因为你可以使用你原来的方法。我知道你先回答了,我对两个答案都投了赞成票,但我更喜欢Bergi的解释。这很好地说明了问题的关键,此外,我认为你的回答中的一些观点有点自以为是。这并不意味着它是错误的,我只是认为Bergi的答案更适合我的风格,如果这有意义的话。Does
调用.call(functor,context,…args)
调用
functor.call(context,…args)
?这是等效的,是的(但不是它不在内部访问和调用
functor的
.call
方法)
Uncaught TypeError: call is not a function