The global
Function
object has no methods or properties of its own,however,since it is a function itself it does inherit some methods and properties through the prototype chain fromFunction.prototype
.
那么Function.prototype有什么意义呢?为什么不将其属性移动到Function并让Function.prototype未定义?函数将从Function派生而来.
对象等同样如此.
解决方法
functions inherit from
Function
你松散地引用了MDN.它实际上说的是:
function objects inherit from
Function.prototype
请注意,在MDN页面上,上面句子中的初始单词“function”是大写的,但仅仅因为它位于句子的开头,而不是因为它指的是JS对象Function.它指的是声明为function(){}的常规旧函数.
请记住,MDN是由凡人写的.我希望他们不使用“继承”和“继承”这两个词,更不用说“派生”了. JS严格意义上没有继承的概念.如果你使用这个术语,你最终会让自己感到困惑. JS拥有的是与对象相关的原型.访问对象上的属性时,如果找不到,则查阅原型.如果没有在那里找到,因为原型也是带有原型的对象,所以原型的原型被咨询,依此类推.
因此,上面的句子最好写成“函数对象具有原型Function.prototype”.
除了Function.prototype是Function的属性之外,JS Function对象不直接与Function.prototype相关联,并且由于Function对象本身就是一个函数,因此它本身具有Function.prototype作为其原型.无论在功能上可能存在或不存在哪些属性,或者由您挂起,都与原型链无关,并且不会被任何人“继承”.
当你执行(function(){}).call()时,首先在函数对象本身上查找call属性/方法;如果它不存在,就像通常不存在那样,那么当声明函数时,它会被内部分配的原型查找,即Function.prototype.如果没有在Function.prototype上,你还会在哪里放置调用或应用等方法?除了Function.prototype之外,您还会将原型自动分配给其他函数?
另外,请注意Function.call将正确解析为内部调用函数.为什么?不是因为那是调用的地方,或者因为那是常规函数“继承”调用的地方,而是因为,正如我之前提到的,函数本身就是一个函数,因此具有原型Function.prototype,可以找到调用在其原型链上.
What’s the point of
Function.prototype
then? Why not move its properties toFunction
and letFunction.prototype
be undefined? Functions would be derived fromFunction
instead.
X.prototype是X上的一个属性,用作使用X作为构造函数创建的对象的原型.因此,要将正确的原型分配给使用Function作为构造函数创建的对象(其中包含声明为函数x(){}的函数),原型必须作为Function上的prototype属性存在.