为什么 `Object.__proto__===Array.__proto__===Function.__proto__`
一直以来我都是认为只有类的实例才有__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 回复
Function
是所有函数的构造函数Object
,Array
是函数 + 函数是对象 ==>Object
,Array
是对象,对象有原型 (__proto__
属性 )- 对象的原型是构造函数的原型对象 ==>
Function.prototype === Object.__proto__
Function.prototype === Array.__proto__
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
@jokerapi 数字和字符串 这些 primitive values 在需要时是会被包裹成 Number, String 对象的。
Object.constructor === Function &&
Array.constructor === Function &&
Function.constructor === Function &&
(() => null).constructor === Function
关系就是: Function 是所有函数的构造函数,所以也是所有构造函数的构造函数,因为所有构造函数都是函数。哈哈哈。
@ianchn 可以的,666
@DevinXian 再来一段 js 绕口令,window.window.window.window.window.window === window
, 233
@waitingsong好文啊,谢谢