javascript中基本类型能调用方法靠自动装箱:引擎临时创建对应包装对象(如new string("hello")),其__proto__指向string.prototype,操作后立即销毁;null和undefined不支持装箱。

JavaScript 中基本类型(如 string、number、boolean)本身不是对象,但访问属性时会临时包装成对应的包装对象,从而能沿原型链查找属性。
基本类型如何“拥有”原型链
基本类型值本身没有 __proto__,也不直接参与原型链。但当你对它们调用方法(如 'hello'.toUpperCase())时,JS 引擎会**自动装箱**:临时创建一个对应包装对象(如 new String('hello')),该对象继承自 String.prototype,因此可访问 toUpperCase 等方法。操作完成后,这个临时对象即被丢弃。
-
123.toString()→ 临时生成new Number(123),其__proto__指向Number.prototype -
true.valueOf()→ 临时生成new Boolean(true),其__proto__指向Boolean.prototype -
null和undefined不支持装箱,调用属性会直接报错:null.toString()→TypeError
基本类型的隐式原型指向哪里
虽然基本值自身无 __proto__,但其包装对象的隐式原型是明确的:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
String包装对象 →__proto__ === String.prototype -
Number包装对象 →__proto__ === Number.prototype -
Boolean包装对象 →__proto__ === Boolean.prototype - 而所有这些
*.prototype的__proto__最终都指向Object.prototype,再往上是null
为什么不能给基本类型添加属性
你无法持久地给基本类型添加属性,因为每次访问都是新生成的临时对象:
-
let s = 'abc'; s.foo = 123;—— 这行看似赋值,实则在临时String实例上设了foo,随后实例销毁,s.foo下次访问就是undefined -
typeof s.foo返回"undefined",验证了赋值未生效 - 这和引用类型(如对象)不同:对象本身是实体,属性写入会保留
实际判断原型链路径的方法
可通过构造函数和 Object.getPrototypeOf 观察包装对象的原型链:
-
Object.getPrototypeOf(new String('a')) === String.prototype→true -
Object.getPrototypeOf(String.prototype) === Object.prototype→true -
Object.getPrototypeOf(Object.prototype)→null - 注意:
typeof 'a'是"string",但'a' instanceof String是false(因它不是构造出来的实例)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










