原型链优化的核心是将共享属性和方法置于原型对象而非实例中,以节省内存并加速查找;需避免在原型上放置可变引用类型,善用Object.create()构建安全继承链,谨慎操作__proto__和动态重写prototype。

用原型链优化属性查找,核心是把共享的属性和方法放到原型对象上,而不是每个实例都重复创建。这样既节省内存,又加快属性访问速度——因为 JavaScript 引擎在查属性时,会按“实例 → 原型 → 原型的原型……”逐级向上查找,一旦在某一级找到就立即返回,避免重复定义和冗余存储。
把方法挂到 prototype 上,别写在构造函数里
每次用 new 创建实例时,如果把方法直接写在构造函数内部(比如 this.say = function() {...}),每个实例都会拥有独立的一份函数副本。这浪费内存,也拖慢初始化速度。
正确做法是统一挂到构造函数的 prototype 上:
function Person(name) {
this.name = name; // 实例独有数据,放这里
}
Person.prototype.say = function() {
return `Hello, I'm ${this.name}`;
};
const p1 = new Person('Alice');
const p2 = new Person('Bob');
// p1.say 和 p2.say 共享同一个函数,不重复创建
避免在原型上放可变的引用类型值
原型是所有实例共享的。如果在 prototype 上直接放数组、对象等引用类型,一个实例修改它,会影响其他实例。
立即学习“Java免费学习笔记(深入)”;
常见错误写法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Person.prototype.hobbies = []; // ❌ 所有实例共用同一个数组
推荐方式:在构造函数中初始化实例专属的引用值,或用 getter 懒加载:
- 在构造函数里初始化:
this.hobbies = []; - 需要共享默认结构时,用 getter 返回新对象:
get config() { return { theme: 'light' }; }
善用 Object.create() 构建干净的原型链
手动设置原型关系时,Object.create() 比直接赋值 Child.prototype = Parent.prototype 更安全——后者会让子类误改父类原型。用 Object.create(Parent.prototype) 可以继承方法,又保持独立性。
示例:
function Animal(name) { this.name = name; }
Animal.prototype.eat = function() { return `${this.name} is eating`; };
function Dog(name, breed) {
Animal.call(this, name); // 继承实例属性
this.breed = breed;
}
Dog.prototype = Object.create(Animal.prototype); // 正确继承原型方法
Dog.prototype.constructor = Dog; // 修复 constructor 指向
const dog = new Dog('Leo', 'Golden');
console.log(dog.eat()); // ✅ 正常调用,且不影响 Animal.prototype
谨慎使用 __proto__ 和动态修改原型
__proto__ 是非标准、已废弃的写法;动态给 prototype 赋值(如 Foo.prototype = {...})会切断已有实例与原型的联系,导致它们无法访问新方法。
安全做法:
- 只在构造函数定义后、实例创建前设置原型
- 新增方法用属性追加:
MyClass.prototype.newMethod = function() {...}; - 避免重写整个
prototype对象
不复杂但容易忽略:属性查找本身很快,瓶颈往往来自不当的数据组织。把该共享的放原型,该隔离的放实例,原型链自然高效。

















