我是Javascript
的初学者,正在学习其中的Object Oriented
和prototyping
。
据我所知,Object
是一个函数,由Function创建,是因为Object.__proto__ === Function.prototype
,但是通过在线查看各种图表,我对如何使用Function.prototype.__proto__ === Object.prototype
感到困惑。
Function.prototype.__proto__
是什么意思?
不是语言所有者开发的东西,因为功能是一切的第一要素。
那是什么意思?我缺少一些重要的事实吗?我浏览了其他 StackOverflow 答案,但找不到与之相关的任何内容。
答案 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
为何成立(问题的核心):它只是意味着Function
是Object
的子类-换句话说,JavaScript运行时可以使其与序言中的上述代码段等效,从而使Function
为Object
的子类(应根据ECMA-262§§19.2.2和19.2.3进行修改)>
请注意,尽管在所有现代(2019)JavaScript实现(node.js和浏览器)上使用__proto__
happens to work,但它的使用是both non-standard and slow。 Consider using “real” ES6 classes instead.
答案 1 :(得分:1)
TL; DR
__proto__
是object
的属性,使您可以在原型链中查找。 prototype
是Function
的属性,它使您可以向构造函数添加可共享的功能。
长答案
通过示例理解这一点,假设您创建了一个构造函数。
function A() {}
,然后创建一个实例var a = new A()
。
然后,添加如下功能:
A.prototype.getA = function () { return 'A'; }
。
现在,如果您尝试访问a.getA()
,则会得到结果,即将执行getA
。
但是,即使在创建实例getA
之后添加了getA
,它如何知道函数a
。因为使用了__proto__
,所以您可以在链中向上移动(您必须听说过原型链)。
从技术上讲,__proto__
是对象的属性,而prototype
是function
的属性。但是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
!