js里创建的函数本身作为一个实例对象都是由内置对象Function作为构造函数创造出来的,所谓var f = funciton(a){b}即等同于f = new Function(a,b)。
同时js里Object也是一个构造函数,因此他也是Function加工出来的。
Function作为一个对象实例,也是Function加工出来的,具有自原性。
但Function的加工原料,也就是原型链的父原型是Object,即Object可以通过Function变成Function。
那么是什么通过Function的加工变成了Object呢?
这就是最原始的那个静态种子,答案就是Object.prototype,在控制台里打印出来是:
- {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
- constructor: ƒ Object()
- hasOwnProperty: ƒ hasOwnProperty()
- isPrototypeOf: ƒ isPrototypeOf()
- propertyIsEnumerable: ƒ propertyIsEnumerable()
- toLocaleString: ƒ toLocaleString()
- toString: ƒ toString()
- valueOf: ƒ valueOf()
- __defineGetter__: ƒ __defineGetter__()
- __defineSetter__: ƒ __defineSetter__()
- __lookupGetter__: ƒ __lookupGetter__()
- __lookupSetter__: ƒ __lookupSetter__()
- get __proto__: ƒ __proto__()
- set __proto__: ƒ __proto__()
而Object.prototype.__proto__==null
Object.prototype.constructor==Object()
那么这就可以这样来梳理了,null作为原料通过Object函数构造出了Object.prototype,
Object.prototype作为原料通过Function函数构造出了Object,
Object作为原料通过Function函数构造出了Function本身。
完美解决了,对吧!
null是什么呢?和数字符字面常量,字符串字符常量,true,false,undefine一起作为js的基本类型,再加上那些运算符等符号就可以看作是开天辟地的真正基础了。而这些基础为什么不是对象呢?不是js里万物皆对象吗?
对于js的创造者来说,仅仅是利用一些相等搭了一个圈,但沉浸在这个世界的人们就永远也看不到其中事物的本源了。
这大概和鸡生蛋还是蛋生鸡这样的哲学本源问题是一致的,就像无论唯心还是唯物,在 西部世界 里所追寻的那个迷宫的核心究竟如何,只要还在其中,就是永远没有答案的。