为什么 `Object.__proto__===Array.__proto__===Function.__proto__`
发布于 6 年前 作者 leavesdrift 5906 次浏览 来自 问答

一直以来我都是认为只有类的实例才有__proto__属性,只有函数才有prototype属性,但是 突然看到一个东西是:

Function.prototype === Object.__proto__
Function.prototype === Array.__proto__
Function.prototype === Function.__proto__

Function.prototype === Function.__proto__

一下就懵逼了,到底 Function 扮演着什么样的角色(和Object, Array的关系),为什么Object,Array非类的实例也具有__proto__属性,又为什么Function.prototype ,Function.__proto__会指向同一块内存呢?

10 回复
  1. Function 是所有函数的构造函数
  2. Object, Array 是函数 + 函数是对象 ==> Object, Array 是对象,对象有原型 ( __proto__ 属性 )
  3. 对象的原型是构造函数的原型对象 ==> Function.prototype === Object.__proto__ Function.prototype === Array.__proto__
  4. Function 也是个函数… ==> Function.prototype === Function.__proto__

最后补充一点: typeof Function.prototype ==> function

Js的世界万物皆对象,知道这个问题就迎刃而解了

万物皆对象那是ruby。 js里,数字还有字符串这些基本类型就不是对象。

在 js 原型链里,最底层是继承至 Object。

Object.prototype.add = (a, b) => a + b; 

(() => 'a').add(1, 2);  // 3
(1.2).add(1, 2);        // 3
'abc'.add(1, 2);        // 3
true.add(1, 2);         // 3

From PWA CNode

@jokerapi 数字和字符串 这些 primitive values 在需要时是会被包裹成 Number, String 对象的。

Object.constructor === Function &&
Array.constructor === Function &&
Function.constructor === Function &&
(() => null).constructor === Function

关系就是: Function 是所有函数的构造函数,所以也是所有构造函数的构造函数,因为所有构造函数都是函数。哈哈哈。

@DevinXian 再来一段 js 绕口令,window.window.window.window.window.window === window, 233

@waitingsong好文啊,谢谢

回到顶部