【问题标题】:confusion over "Object.__proto__ === Function.prototype" returning "true" [duplicate]混淆“Object.__proto__ === Function.prototype”返回“true”[重复]
【发布时间】:2017-08-10 12:35:24
【问题描述】:

我一直认为javascript中的函数是对象,Function.__proto__等于Object.prototype。但是当我在 chrome 控制台中输入以下代码时,输​​出是

> Function.__proto__ === Object.prototype;
> false
> Object.__proto__ === Function.prototype;
> true

我现在很困惑。函数是否继承自对象?还是相反?

【问题讨论】:

  • @TonyStark 几乎零个对象继承自Object。他们继承自 Object.prototype
  • 说“函数是对象”和“Object 是函数”是有区别的,因为这两种说法都是正确的,但它们指的是不同的东西。
  • @TonyStark:这是一个对象:{}。这不是一个函数。 Object{} 等对象的构造函数)一个函数,你可以调用它(Object())。
  • 如果有帮助,您的原始支票的正确格式应该是 Function.prototype instanceof ObjectObject.prototype instanceof Function

标签: javascript function object prototype


【解决方案1】:

Object是一个函数(可以使用new Object()),因此:

Object.__proto__ === Function.prototype // true

同样,Function 是一个函数(你可以使用new Function()),因此:

Function.__proto__ === Function.prototype // true

如果我们更深一层,所有函数都是对象,因此:

Function.__proto__.__proto__ === Object.prototype // true

【讨论】:

  • 这是否意味着“函数”是原型链的末端,而不是“对象”?
  • @TonyStark:是的,Object.__proto__.__proto__Object.prototype,所以整个原型链是对象→函数。
  • 不,Function.__proto__.__proto__ === Object.prototype。您只是注意到Function 拥有的循环关系。
  • @TonyStark:我想这取决于你认为链条的哪一侧是“末端”。 Object 是一个函数。它的原型是Function.prototype,是链上的第一个原型。 Function.prototype 的原型是 Object.prototype,链上的最后一个原型。这意味着Object既是函数又是对象(因为所有函数都是对象),您可以通过Object instanceof FunctionObject instanceof Object进行验证。
  • @TonyStark 在实践中,最好忽略 __proto__ 属性存在的事实(首先因为它是非标准的,其次因为最好不要更改它,除非对象是首先创建的)。这些特定示例令人困惑,因为您将重点放在构造函数继承自什么上,而您应该考虑构造函数生成的对象继承自什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2017-01-11
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多