最简单的原型链继承是让子类prototype直接等于父类实例;它实现方法复用和属性继承,但导致引用类型属性被所有子类实例共享,因原型上的引用值为同一对象。

最简单的原型链继承,就是让子类的 prototype 直接等于父类的一个实例。它能快速实现方法复用和属性继承,但会带来引用类型属性被所有子类实例共享的问题。
怎么做:三步写出可运行的继承
1. 定义父类(含实例属性和原型方法)
2. 定义子类(空构造函数即可)
3. 关键一步:把子类的 prototype 设为父类实例,并修正 constructor
示例代码:
function Parent() {
this.name = 'Parent';
this.colors = ['red', 'blue'];
}
Parent.prototype.say = function() { return 'Hello'; };
function Child() {}
Child.prototype = new Parent(); // ← 核心操作
Child.prototype.constructor = Child; // ← 修复 constructor
为什么引用属性会共享?
因为 Child.prototype 是一个 Parent 实例,而这个实例里的 colors 是一个数组(引用类型)。所有 Child 实例在查找 colors 时,都会顺着原型链找到同一个数组对象。
验证方式:
const c1 = new Child(); c1.colors.push('green');const c2 = new Child(); console.log(c2.colors); // ['red','blue','green']
这不是 bug,是原型链机制的自然结果 —— 共享的是原型上的值,不是每个实例自己拥有的副本。
什么时候可以接受这种共享?
当属性是只读配置、常量或初始化后不再修改时,比如:this.type = 'button';(基本类型,无影响)this.defaults = Object.freeze({ size: 'md' });(冻结对象,无法意外修改)
若需每个实例独立拥有引用属性,就不能只靠原型链,得配合构造函数调用(如组合继承)来初始化实例自有属性。










