Object.create的核心思想可以概括为:
function create(prt){
var noOP = function(){};
noOP.prototype = prt;
return new noOP;
}
因此,返回的值不是函数,而是对象。为了说明这一点,我首先会存储一个函数:
var u = function(){return 5}
现在我将在它上面使用 "Object.create":
var res = create(u);
安慰后,你会得到>noOP {}
,所以这是一个普通对象。问题就从这里开始:
res.hasOwnProperty("prototype") //false
因此,新创建的对象具有"prototype",但实际上是从u
继承而来的。
res.prototype === u.prototype //true
同样的,“call”是再次从u继承而来,而u又继承自其构造函数(Function)的原型:
res.call === u.call //true
res.call === Function.prototype.call //also true
以下是您的问题,如果您查看call
的EcmaScript实现,它期望一个可调用的this
。请将call
从res
中隔离出来:
var x = res.call; //ƒ call() { [native code] }
现在我将“调用”该调用,我们将传递3个参数,第一个是要调用的内容,第二个是在可调用内部设置this
,第三个及以后是可调用的参数:
x.call(function(a){console.log("hey");console.log(a);console.log(this);},5,5)
现在尝试在您创建的对象
res
上执行相同操作,可以使用
res.call
或
x.call
进行调用。
x.call(res,5,5) //TypeError: x.call is not a function
最终,问题归结为从
Object.create
返回的对象不可调用。
x
没有函数体。您无法调用没有函数体的函数。 - AlnitakObject.create
并不会产生与传递该类型的原型相同的结果。通常情况下,你应该选择后者。 - Alnitak