CNode

为什么 `Object.__proto__===Array.__proto__===Function.__proto__`

问答
Lleavesdrift发布于9 年前最后回复9 年前10 回复7880 浏览0 收藏

一直以来我都是认为只有类的实例才有__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)

X
xiedacon#1·9 年前
  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

L
lpbird#2·9 年前

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

J
jamieYou#3·9 年前

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

L
Lizhooh#4·9 年前

在 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

I
ianchn#5·9 年前
引用 jamieYou万物皆对象那是ruby。 js里,数字还有字符串这些基本类型就不是对象。

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

I
ianchn#6·9 年前
Object.constructor === Function &&
Array.constructor === Function &&
Function.constructor === Function &&
(() => null).constructor === Function

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

I
ianchn#8·9 年前
引用 DevinXian@ianchn 可以的,666

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

参与回复
登录后即可参与回复。登录