“万物皆对象”成立的前提是除null和undefined外所有值都通过原型链连接到Object.prototype,原型链是其底层支撑,使属性查找、方法继承等行为得以实现。

“万物皆对象”不是字面意义上的绝对断言,而是对 JavaScript 类型系统和对象模型的高度概括——它成立的前提是:除了 null 和 undefined,所有值(包括函数、数组、正则、日期、甚至基本类型包装对象)都具备对象特征,且最终都通过原型链连接到 Object.prototype。这个说法和原型链不是并列关系,而是因果关系:正是因为原型链的存在,“万物皆对象”才在行为层面真正成立。
原型链是“万物皆对象”的底层支撑
JavaScript 没有传统类体系,所有对象的属性查找、方法继承、类型识别,全靠 [[Prototype]](即 __proto__)逐级向上委托实现:
- 你写
[],得到的是数组实例,它的__proto__指向Array.prototype,而Array.prototype.__proto__又指向Object.prototype; - 你写
/\d+/,正则对象的__proto__指向RegExp.prototype,再往上仍是Object.prototype; - 连函数本身也是对象:
function f(){}的__proto__是Function.prototype,而Function.prototype.__proto__同样是Object.prototype。
“对象感”来自原型链赋予的行为能力
一个值是否“像对象”,不取决于它是不是用 {} 创建的,而取决于它能否使用对象共有的方法和机制:
-
toString()、valueOf()、hasOwnProperty()这些方法,全部定义在Object.prototype上,所有对象都能访问,靠的就是原型链自动向上查找; -
instanceof判断依赖原型链:判断某个对象的__proto__链中是否存在指定构造函数的prototype; - 就连基本类型如
"abc"调用"abc".toUpperCase(),也是临时包装成String对象,再通过其原型链找到String.prototype.toUpperCase。
例外与边界:null 和 undefined 是“非对象”的锚点
它们是唯一两个没有原型的对象:
-
Object.getPrototypeOf(null)报错,null.__proto__是非法访问; -
undefined同理,既不能读__proto__,也不能被Object.create()作为原型; - 正因如此,它们成了原型链的终点(或起点的反面),也划出了“万物皆对象”的实际边界。
函数对象是原型链的关键枢纽
函数既是可执行代码,又是构造器,天然承担双重角色:
- 每个函数都有
prototype属性(普通对象没有),用于创建实例时赋给新对象的__proto__; -
Function自身是函数对象,Function.prototype是个空函数,它的__proto__才是Object.prototype; -
Object也是函数对象,Object.prototype的__proto__是null——这是整条原型链的终点。


















