javascript对象的原型在创建时即确定,由构造方式决定:字面量{}指向object.prototype,new fn()指向fn.prototype,[]指向array.prototype,function(){}指向function.prototype,object.create(proto)则直接设为proto。

JavaScript 对象的原型在创建时就已确定,不是运行时动态“分配”的,而是由对象的构造方式决定的。关键在于:每个对象都自带一个内部属性 [[Prototype]],它在对象诞生那一刻就被设为某个原型对象的引用,这个过程由引擎自动完成,开发者无法跳过或延迟。
普通对象字面量的原型初始化
用 {} 或 Object literal 创建的对象,其 [[Prototype]] 会直接指向 Object.prototype:
- 引擎识别到这是通过
Object构造函数隐式调用创建的(等价于new Object()) - 因此该对象的
[[Prototype]]被设为Object.prototype -
Object.prototype.__proto__是null,所以这条链在此终止
构造函数实例的原型初始化
使用 new Fn() 创建实例时,原型初始化遵循明确规则:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 引擎将新对象的
[[Prototype]]内部属性设为Fn.prototype的当前值 - 这个赋值发生在
new过程的早期阶段,在执行构造函数体之前 - 也就是说,即使你在构造函数里修改了
Fn.prototype,也不会影响已经创建的实例,但会影响后续新实例
数组、函数等内置对象的原型初始化
不同字面量语法对应不同内置构造函数,因而原型指向也不同:
-
[]→ 原型是Array.prototype(而非Object.prototype直接) -
function() {}→ 原型是Function.prototype -
/regex/→ 原型是RegExp.prototype - 所有这些内置原型最终都链向
Object.prototype,再指向null
Object.create() 的原型初始化
这是唯一能显式指定原型的方式:
-
Object.create(proto)创建的对象,其[[Prototype]]直接设为参数proto - 若传入
null,则该对象没有原型(__proto__为null),不继承任何方法 - 若传入普通对象,该对象就成为新对象的直接原型,形成自定义继承链
本质上,原型初始化是 JavaScript 引擎在对象诞生瞬间完成的一次单向指针设置,它不涉及复制、深拷贝或运行时计算,纯粹是内存中的一次引用绑定。整个机制轻量、确定、不可逆——这也是原型链高效且可预测的基础。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










