Function.prototype.__proto__ 是什么意思?
What is meaning of Function.prototype.__proto__?
我是 Javascript
的初学者,正在学习其中的 Object Oriented
和 prototyping
。
据我所知,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
成立(你的问题的核心):它只是意味着 Function
是 Object
的子 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
的 属性,它使您能够在原型链中查找。虽然 prototype
是 Function
的 属性,它使您能够向构造函数添加可共享的功能。
Long Answer
通过示例了解这一点,假设您创建了一个构造函数。
function A() {}
然后创建它的一个实例,var a = new A()
.
然后,添加如下函数:
A.prototype.getA = function () { return 'A'; }
.
现在,如果您尝试访问 a.getA()
,您将得到结果,即 getA
将被执行。
但是它怎么知道函数 getA
即使 getA
是在创建实例 a
之后添加的。这是因为使用了__proto__
,你可以在链中向上遍历(你一定听说过prototype chaining)。
从技术上讲,__proto__
是对象的 属性,而 prototype
是 function
的 属性。但是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
!
我是 Javascript
的初学者,正在学习其中的 Object Oriented
和 prototyping
。
据我所知,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
成立(你的问题的核心):它只是意味着 Function
是 Object
的子 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
的 属性,它使您能够在原型链中查找。虽然 prototype
是 Function
的 属性,它使您能够向构造函数添加可共享的功能。
Long Answer
通过示例了解这一点,假设您创建了一个构造函数。
function A() {}
然后创建它的一个实例,var a = new A()
.
然后,添加如下函数:
A.prototype.getA = function () { return 'A'; }
.
现在,如果您尝试访问 a.getA()
,您将得到结果,即 getA
将被执行。
但是它怎么知道函数 getA
即使 getA
是在创建实例 a
之后添加的。这是因为使用了__proto__
,你可以在链中向上遍历(你一定听说过prototype chaining)。
从技术上讲,__proto__
是对象的 属性,而 prototype
是 function
的 属性。但是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
!