javascript原型链的核心价值在于共享方法、减少内存占用和实现轻量级继承;它通过原型共享函数、支持单向继承关系、按“自有优先、逐级向上”查找属性,并推荐使用object.getprototypeof等标准api而非__proto__。

JavaScript原型链的核心价值在于共享方法、减少内存占用和实现轻量级继承。它不是用来“构造复杂结构”的工具,而是让对象自然复用行为的底层机制。用对了,代码更简洁;用偏了,反而增加理解成本。
把通用方法挂到原型上,避免重复创建
每个实例对象如果都独立定义相同方法,会浪费内存。把函数写在构造函数内部,每次 new 都新建一份;而写在 Constructor.prototype 上,所有实例共用一个函数引用。
- ❌ 错误写法(每个实例都有一份 sayHello):
function Person(name) {<br> this.name = name;<br> this.sayHello = function() { console.log('Hi ' + this.name); };<br>} - ✅ 正确写法(所有实例共享):
function Person(name) {<br> this.name = name;<br>}<br>Person.prototype.sayHello = function() {<br> console.log('Hi ' + this.name);<br>};
通过原型链实现单向继承关系
让子类型“看起来像”父类型,同时扩展自己独有的能力。关键不是深套多层,而是明确谁继承谁、共享什么。
- 用
Object.create(Parent.prototype)设置子类原型,再补上constructor指回自身; - 子类实例既能调用自己原型上的方法,也能沿链找到父类原型上的方法;
- 例如:
Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog;,之后new Dog()就能用eat()(来自 Animal)和bark()(来自 Dog)。
属性查找遵循“自有优先、逐级向上”原则
这是原型链最实用的行为逻辑——你不需要手动遍历,JS 引擎自动按规则找。理解这点,就能预判代码运行结果。
- 访问
obj.x:先查obj自身有没有x; - 没有就查
obj.__proto__(即它的构造函数的prototype); - 还没就查
obj.__proto__.__proto__,直到Object.prototype; - 再往上是
null,查不到就返回undefined。
慎用 __proto__,优先用标准 API
__proto__ 是非标准但广泛支持的属性,适合调试或学习时观察链路;生产环境推荐使用更规范的方式。
- 获取对象原型:用
Object.getPrototypeOf(obj); - 设置新对象的原型:用
Object.create(proto); - 检查是否在原型链上:用
obj instanceof Constructor或Constructor.prototype.isPrototypeOf(obj)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











