【问题标题】:What is meaning of Function.prototype.__proto__?Function.prototype.__proto__ 是什么意思?
【发布时间】:2019-03-05 11:20:59
【问题描述】:

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

据我所知,Object 是一个函数,是由 Function 创建的,因为Object.__proto__ === Function.prototype 但是通过网上的各种图表,我对 Function.prototype.__proto__ === Object.prototype 的原理感到很困惑。

Function.prototype.__proto__ 是什么意思?

这不是语言所有者开发的东西吗,因为 Function 是一切都来自的第一件事。

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

【问题讨论】:

  • proto 总是指对象的超类型,所以在我们的例子中,如果它后缀为 Function.prototype 将类似于 Object.prototype,因为 Object 是函数的超类型
  • @BenFortune 请理解我的问题。通过查看您发布的问题图表,我产生了疑问。它是如何复制的?
  • __proto__ 是一种已弃用的访问对象原型的方法(不是原型属性,而是内部 [[Prototype]] 插槽)。现代方式是Reflect.getPropotypeOfFunction.prototypeObject 的实例,继承自 Object.prototype。因此,您添加的所有内容 Object.prototype.test = 'test'; console.log((function(){}).test) 都会被继承。

标签: javascript function object prototype


【解决方案1】:

TL;DR

__proto__object 的一个属性,它使您能够在原型链中查找。而prototypeFunction 的属性,它使您能够将可共享的功能添加到构造函数。

长答案

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

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

然后,添加如下函数:

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

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

但是即使在创建实例a 之后添加了getA,它又如何知道函数getA。正是因为使用了__proto__,所以你可以在链中向上遍历(你一定听说过原型链)。

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

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

现在回答你的问题:

Function.prototype.__proto__ 是什么意思?

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

Function.prototype.__proto__ === Object.prototype

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

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

Object 的属性,比如说toString。你可以这样做,A.toString() // A created at the start。但是我们从来没有为A构造函数创建函数toString

【讨论】:

    【解决方案2】:

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

    从经典(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 运行时执行与上述代码等效的操作sn-p 在他们的序曲中,以便使 Function 成为 Object 的子类(按照 ECMA-262 §§ 19.2.2 和 19.2.3,他们应该这样做)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2017-06-11
      • 2018-03-05
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多