微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – Function和Function.prototype之间的区别

根据 this,函数依次从Function.prototype继承Function和Function:

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 from Function.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 to Function and let Function.prototype be undefined? Functions would be derived from Function instead.

X.prototype是X上的一个属性,用作使用X作为构造函数创建的对象的原型.因此,要将正确的原型分配给使用Function作为构造函数创建的对象(其中包含声明为函数x(){}的函数),原型必须作为Function上的prototype属性存在.

原文地址:https://www.jb51.cc/js/150610.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐