Javascript 函数的类型不是函数

Javascript 函数的类型不是函数,javascript,inheritance,Javascript,Inheritance,同事给我看了下一个代码,让我大吃一惊: const x=Object.create(function(){}); //变量:const x=Object.create(数组); console.log(x.call)//call(){[native code]} console.log(typeof x.call)/“函数” console.log(x.call instanceof函数)//true x、 call()//Uncaught TypeError:x.call不是一个函数,因为x

同事给我看了下一个代码,让我大吃一惊:

const x=Object.create(function(){});
//变量:const x=Object.create(数组);
console.log(x.call)//call(){[native code]}
console.log(typeof x.call)/“函数”
console.log(x.call instanceof函数)//true

x、 call()//Uncaught TypeError:x.call不是一个函数,因为
x
是一个从
函数继承
call
的对象。prototype
,但是
call
意味着要在函数上调用,因此如果您试图在普通对象上执行它,它就会失败

Object.create背后的核心思想归结为:

function create(prt){
    var noOP = function(){};
    noOP.prototype = prt;
    return new noOP;
}
因此,返回的值不是函数,而是对象。为了举例说明,我将首先存储一个函数:

var u = function(){return 5}
现在我将使用
对象。在其上创建

var res = create(u);
安慰它会给你带来noOP{}
,所以它是一个普通的对象。问题从这里开始:

res.hasOwnProperty("prototype") //false
因此,新创建的对象具有“原型”,但这实际上是从
u
继承的:

res.prototype === u.prototype //true
类似地,“调用”再次从u继承,而u又从其构造函数(函数)原型继承:

res.call === u.call //true
res.call === Function.prototype.call //also true
这里是您的问题,如果您查看
call
的EcmaScript实现,它期望
this
this
应该是可调用的。从
res
中隔离
调用

var x = res.call; //ƒ call() { [native code] }
现在我将“调用”该调用,我们将传递3个参数,第一个用于调用什么,第二个用于在该可调用中设置
,第三个用于可调用的参数,依此类推:

x.call(function(a){console.log("hey");console.log(a);console.log(this);},5,5)
//hey
//5
//Number {5}
现在,通过
res.call
x.call
对您创建的对象
res
进行相同的尝试:

x.call(res,5,5) //TypeError: x.call is not a function

最后,它归结为从
对象返回的对象。create
不可调用。

有时更准确的错误消息是有用的,FF说:“TypeError:Function.prototype.call在不兼容的对象上调用”注意
x
没有函数体。不能调用没有实例的函数。还要注意,将类型的实例传递给
对象。create
不会产生与传递该类型的原型相同的结果。您通常希望执行后一种操作。在Chrome上,Function.prototype.call()
返回
未定义的
,并且不会产生错误。@alnitak oops,看起来像是
函数。prototype()
本身就是一个函数。。。