Function.prototype .__ proto__是什么意思?

时间:2019-03-05 11:20:59

标签: javascript function object prototype

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

据我所知,Object是一个函数,由Function创建,是因为Object.__proto__ === Function.prototype,但是通过在线查看各种图表,我对如何使用Function.prototype.__proto__ === Object.prototype感到困惑。

Function.prototype.__proto__是什么意思?

不是语言所有者开发的东西,因为功能是一切的第一要素。

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

2 个答案:

答案 0 :(得分:1)

myFunc.prototype是通过调用__proto__构造的任何对象的new myFunc()

考虑到经典(Java或C ++风格)OO,您可以说myFunc是构造函数,myFunc.prototype是类。从这个意义上讲,myFunc.prototype.__proto__是超类;也就是使用new myFunc创建的所有对象的原型的原型。

myFunc.prototype.__proto__可以做的一件有用的事分配给它来创建超类关系,例如

myFunc.prototype.__proto__ = mySuperclassConstructor.prototype

这个惯用法揭示了Function.prototype.__proto__ === Object.prototype为何成立(问题的核心):它只是意味着FunctionObject的子类-换句话说,JavaScript运行时可以使其与序言中的上述代码段等效,从而使FunctionObject的子类(应根据ECMA-262§§19.2.2和19.2.3进行修改)

请注意,尽管在所有现代(2019)JavaScript实现(node.js和浏览器)上使用__proto__ happens to work,但它的使用是both non-standard and slowConsider using “real” ES6 classes instead.

答案 1 :(得分:1)

  

TL; DR

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

  

长答案

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

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

然后,添加如下功能:

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

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

但是,即使在创建实例getA之后添加了getA,它如何知道函数a。因为使用了__proto__,所以您可以在链中向上移动(您必须听说过原型链)。

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

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

现在回答您的问题:

  

Function.prototype.__proto__是什么意思?

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

  

Function.prototype.__proto__ === Object.prototype

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

  

任何函数都可以访问对象的所有属性。怎么样?

Object的属性,例如toString。您可以这样做,A.toString() // A created at the start。但是我们从未为toString构造函数创建函数A