JavaScript是基于原型的语言,因其不依赖类而通过对象间委托关系实现复用与继承,该关系由prototype、__proto__及原型链终止于null共同构建。
JavaScript 是基于原型的语言,因为它不依赖“类”来定义对象结构和行为,而是直接通过对象与对象之间的委托关系实现复用和继承。这种委托关系由原型链承载,是语言底层的核心机制。
原型链不是自动凭空生成的,而是由三类关键要素协同建立:
function Person() {},Person.prototype 就是将来所有 new Person() 实例的“公共原型”。prototype 对象。比如 const p = new Person(),那么 p.__proto__ === Person.prototype。Person.prototype.__proto__ 指向 Object.prototype;而 Object.prototype.__proto__ 是 null,标志着原型链终止。这体现在设计哲学和运行时行为两个层面:
class 只是对构造函数 + 原型操作的封装,底层仍靠 prototype 和 __proto__ 工作。你无法像 Java 那样定义静态类型或编译期继承关系。Object.create(obj) 让一个空对象以 obj 为原型,无需构造函数。这是典型的“基于原型”的建模方式——复制+定制,而非实例化类模板。p.name 时,引擎先查 p 自身,再查 p.__proto__,再查 p.__proto__.__proto_
_……直到找到或到 null。这个动态查找过程就是委托,是原型语言的标志性特征。下面代码展示了链是如何一层层连接的:
function Animal(name) { this.name = name; }
Animal.prototype.speak = function() { console.log(this.name + ' makes a sound'); };
const dog = new Animal('Dog');
console.log(dog.__proto__ === Animal.prototype); // true
console.log(Animal.prototype.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__); // null
从 dog 开始,沿着 __proto__ 向上:Animal.prototype → Object.prototype → null,构成一条清晰、可验证的原型链。
它还支撑着 JavaScript 的许多基础能力:
toString、hasOwnProperty 等方法,源头都在 Object.prototype;Array.prototype.push 扩展)能立即对所有数组实例生效,正因它们共享原型。