gpt4 book ai didi

javascript - Function 和 Function.prototype 的区别

转载 作者:数据小太阳 更新时间:2023-10-29 05:12:04 25 4
gpt4 key购买 nike

根据 this ,函数依次继承自FunctionFunctionFunction.prototype:

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.prototypeundefined?函数将派生自 Function

同样适用于 Object

最佳答案

functions inherit from Function

您是在松散地引用 MDN。它实际上说的是:

function objects inherit from Function.prototype

请注意,在 MDN 页面上,上面句子中的首字母“function”是大写的,但这只是因为它在句子的开头,并不是因为它指的是 JS 对象 Function。它指的是声明为 function() { } 的常规旧函数。

请记住,MDN 是由凡人编写的。我宁愿他们不使用“继承”和“继承”这些词,更不用说“派生”了。 JS没有严格意义上的继承这个概念。如果你使用这个术语,你最终会把自己弄糊涂。 JS 拥有的是与对象关联的原型(prototype)。当访问一个对象的属性时,如果没有找到,就会查询原型(prototype)。如果在那里找不到,因为原型(prototype)也是具有原型(prototype)的对象,所以会查询原型(prototype)的原型(prototype),依此类推。

因此,上面这句话最好写成“函数对象have as their prototype Function.prototype”。

JS Function 对象不直接与 Function.prototype 关联,除了 Function.prototypeFunction,而且,由于 Function 对象本身就是一个函数,它本身就有 Function.prototype 作为它的原型(prototype)。无论 Function 中可能存在或不存在的任何属性,或由您附加在其上的任何属性,都与原型(prototype)链无关,也不会被任何人“继承”。

当您执行 (function() { }).call() 时,首先会在函数对象本身上查找 call 属性/方法;如果它在那里不存在(通常不存在),则在声明函数时固有分配的原型(prototype)上查找它,即 Function.prototype。如果不在 Function.prototype 上,您还会在哪里放置诸如 callapply 之类的方法?除了 Function.prototype 之外,您还会将自动分配给函数的原型(prototype)称为什么?

顺便说一句,请注意 Function.call 将正确解析为内部 call 函数。为什么?不是因为那是 call 存在的地方,也不是因为那是常规函数“继承”call 的地方,而是因为,正如我之前提到的,Function本身是一个函数,因此有原型(prototype)Function.prototypecall可以在它的原型(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 作为构造函数创建的对象的原型(prototype)。因此,要将正确的原型(prototype)分配给使用 Function 作为构造函数创建的对象(包括声明为 function x() { } 的函数),原型(prototype)必须作为Function 上的 prototype 属性。

关于javascript - Function 和 Function.prototype 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33875021/

25 4 0
文章推荐: javascript - typescript : Array vs Object[]