Function.prototype.__proto__ 是什么意思?

What is meaning of Function.prototype.__proto__?

我是 Javascript 的初学者,正在学习其中的 Object Orientedprototyping

据我所知,Object是一个函数,是由Function创建的,因为Object.__proto__ === Function.prototype但是在网上浏览了各种图表,我很困惑Function.prototype.__proto__ === Object.prototype .

Function.prototype.__proto__是什么意思?

它不是语言所有者开发的东西吗,因为功能是一切到达的第一件事。

那又是什么意思呢?我缺少一些重要的事实吗?我查看了其他 Whosebug 答案,但找不到与之相关的任何内容。

myFunc.prototype 是通过调用 new myFunc().

构造的任何对象的 __proto__

从 classical(Java- 或 C++ 风格)OO 的角度思考,您可以说 myFunc 是一个构造函数并且(因此)myFunc.prototype是class。从这个意义上说,myFunc.prototype.__proto__ 是超级class;即用new myFunc.

创建的所有对象的原型的原型

您可以对 myFunc.prototype.__proto__ 做的一件有用的事情是分配给它以创建超级 class 关系,例如

myFunc.prototype.__proto__ = mySuperclassConstructor.prototype

这个习语阐明了为什么 Function.prototype.__proto__ === Object.prototype 成立(你的问题的核心):它只是意味着 FunctionObject 的子 class — 或者换句话说,Java脚本运行时在它们的前奏中做了一些等同于上面代码片段的事情,以便使 Function 成为 Object 的子class(他们应该这样做,per ECMA-262 §§ 19.2.2 和 19.2.3)

不过要小心,而 __proto__ happens to work on all modern (2019) JavaScript implementations (node.js and browsers), its use is both non-standard and slow. Consider using “real” ES6 classes instead.

TL;DR

__proto__object 的 属性,它使您能够在原型链中查找。虽然 prototypeFunction 的 属性,它使您能够向构造函数添加可共享的功能。

Long Answer

通过示例了解这一点,假设您创建了一个构造函数。

function A() {} 然后创建它的一个实例,var a = new A().

然后,添加如下函数:

A.prototype.getA = function () { return 'A'; }.

现在,如果您尝试访问 a.getA(),您将得到结果,即 getA 将被执行。

但是它怎么知道函数 getA 即使 getA 是在创建实例 a 之后添加的。这是因为使用了__proto__,你可以在链中向上遍历(你一定听说过prototype chaining)。

从技术上讲,__proto__ 是对象的 属性,而 prototypefunction 的 属性。但是functions怎么会有属性呢?因为 JavaScript 中的所有内容都隐式转换为对象。有没有想过你怎么会这样:'test'.toUpperCase()?字符串文字不是 'not object' 并且它们是原语吗?

阅读此内容以供参考:http://jayendra.co.in/objects-in-javascript/

现在回答你的问题:

What does Function.prototype.__proto__ mean?

您正在尝试访问 Function 构造函数的 prototype 属性。请记住,prototype 本身就是一个 object,因此您可以访问 constructor__proto__.

等属性

Function.prototype.__proto__ === Object.prototype

要启用链接,当您访问 __proto__ 属性 时,您正在查找!

Any function can access all the properties of an object. How?

A 属性 of Object,比方说 toString。你可以做到,A.toString() // A created at the start。但是我们从未为 A 构造函数创建函数 toString