原型对象是构造函数prototype属性所指向的默认对象,由引擎自动创建并绑定;它自带constructor属性回指构造函数,实例的__proto__指向该原型,形成以Object.prototype为终点、null终止的查找链。

原型对象就是构造函数的 prototype 属性所指向的那个对象。它不是独立存在的抽象概念,而是实实在在的一个对象实例,由 JavaScript 引擎在函数定义时自动创建,并通过 prototype 属性与构造函数绑定。
prototype 是函数专属的“原型出口”
只有函数(且非箭头函数)才有 prototype 属性;普通对象、数组字面量、日期实例等都没有。这个属性一诞生就指向一个默认对象,即该函数的原型对象。
- 这个默认原型对象自带
constructor属性,值为当前构造函数本身 - 你可以直接往
Fn.prototype上添加方法或属性,例如:Person.prototype.sayHi = function() { console.log('Hi!'); }; - 所有通过
new Person()创建的实例,都能立即访问到sayHi,因为它们共享同一个原型对象
实例的 __proto__ 指向的就是 prototype 所指的对象
当你执行 const p = new Person('Alice');,引擎会把 p.__proto__ 内部链接设置为 Person.prototype。这是原型机制最核心的一环。
-
p.__proto__ === Person.prototype恒为true - 实例调用方法时,先查自身,再顺着
__proto__去Person.prototype查找——这就是委托机制 - 修改
Person.prototype会影响所有已有和未来实例,因为它们共用这一个对象
重写 prototype 时必须手动修复 constructor
如果用赋值方式完全替换原型,比如 Person.prototype = { sayHi() {} };,新对象没有 constructor 属性,会导致 Person.prototype.constructor 指向 Object 而非 Person。
立即学习“Java免费学习笔记(深入)”;
- 这会影响
instance.constructor的准确性,也可能干扰某些依赖类型判断的逻辑 - 修复方式有两种:显式补上
Person.prototype.constructor = Person;,或在新对象中直接声明:Person.prototype = { constructor: Person, sayHi() {} }; - constructor 不参与属性查找,纯属语义标识,但对调试和框架识别很关键
原型链终点是 Object.prototype
Person.prototype 本身是个普通对象,所以它也有 __proto__,其值为 Object.prototype;而 Object.prototype.__proto__ 是 null,标志着整个链的终结。
- 这意味着所有构造函数的实例,都间接继承了
Object.prototype上的方法,如hasOwnProperty、toString - 可通过
p.__proto__.__proto__ === Object.prototype验证这一层级关系 - 这也解释了为什么几乎所有对象都能调用
toString():它来自原型链顶端的共享基础


















