JavaScript方法共享与复用的核心机制是原型链——共用方法定义在构造函数prototype上,实例通过__proto__指向它;构造函数只初始化属性,行为统一挂载prototype;__proto__指向构造函数的prototype;继承需用Object.create(Parent.prototype)并修复constructor。

JavaScript 中方法共享与复用的核心机制就是原型链——把共用的方法定义在构造函数的 prototype 上,所有实例通过隐式原型 __proto__ 指向它,从而访问同一份方法,节省内存、便于维护。
把方法挂到 prototype 上,而非构造函数内部
如果在构造函数里用 this.method = function() {...} 定义方法,每次创建实例都会生成一份新函数,浪费内存。正确做法是统一放在原型对象上:
- 构造函数只负责初始化实例属性(如
this.name) - 所有可复用的行为(如
getName、sayHello)写在Constructor.prototype上 - 这样无论创建多少个实例,它们调用的都是同一个函数引用
理解 __proto__ 与 prototype 的关系
prototype 是函数对象独有的属性,用于指定“将来实例的原型”;而 __proto__ 是每个实例对象的内部属性,指向其构造函数的 prototype。例如:
const obj = new Person();obj.__proto__ === Person.prototype // true
正是这个链接让 obj.sayHello() 能顺着原型链找到 Person.prototype.sayHello。
立即学习“Java免费学习笔记(深入)”;
支持原型链继承:子类复用父类方法
通过 Child.prototype = Object.create(Parent.prototype) 并修正 constructor,子类原型就能继承父类原型上的所有方法:
- 子类实例既能访问自身原型的方法,也能访问父类原型的方法
- 可在子类原型中重写父类方法(实现多态),或用
Parent.prototype.method.call(this)显式调用父类逻辑 - 现代写法可用
class+extends,底层仍是基于原型链
注意 constructor 属性的修复
直接赋值 Child.prototype = Parent.prototype 或 Object.create(Parent.prototype) 后,Child.prototype.constructor 会指向 Parent,造成混淆。应手动修复:
Child.prototype.constructor = Child;
否则 new Child().__proto__.constructor 就不是 Child,会影响 instanceof 判断和某些依赖 constructor 的库行为。


















