JavaScript手动模拟原型链继承的核心是:通过Object.create(Parent.prototype)设置子类原型链、重置constructor、在子类构造函数中用Parent.call(this)继承实例属性,并避免原型上引用类型共享。
JavaScript 中手动模拟原型链继承,核心是让子类实例能访问父类原型上的方法和属性。不依赖 class 语法或 extends,而是通过操作 prototype 和 constructor,并配合 Object.setPrototypeOf() 或构造函数内部的 call() 来实现属性和方法的继承。
要让子类实例能使用父类原型上的方法(比如 sayName()),必须让子类的 prototype 原型对象继承自父类的 prototype。最直接的方式是用 Object.setPrototypeOf(Child.prototype, Parent.prototype)。
Child.prototype = Parent.prototype,否则会污染父类原型Child.prototype = Object.create(Parent.prototype)
constructor 指向,避免实例的 constructor 错误地指向父类:Child.prototype.constructor = Child
仅继承原型方法还不够,实例自有属性(如 this.name)需要在子类构造时由父类构造函数初始化。通常用 Parent.call(this, ...args) 实现。
this 绑定到当前子类实例,从而把父类定义的实例属性“复制”过来function Student(name, grade) { Person.call(this, name); this.grade = grade; }
如果父类原型上挂了数组、对象等引用类型,而子类又没正确隔离,多个实例会共享同一份数据。
立即学习“Java免费学习笔记(深入)”;
this.skills = []),而非写在原型上this.xxx 而非 Parent.prototype.xxx
以下是一个无 class 的典型实现:
function Person(name) { this.name = name;}Person.prototype.sayName = function() { console.log('I am ' + this.name);};function Student(name, grade) { Person.call(this, name); // 继承实例属性 this.grade = grade;}// 设置原型链Student.prototype = Object.create(Person.prototype);Student.prototype.constructor = Student;// 添加子类特有方法Student.prototype.sayGrade = function() { console.log('Grade: ' + this.grade);};
此时 new Student('Alice', 'A') 既能调用 sayName(),也能调用 sayGrade(),且 instanceof 判定准确。