为什么JavaScript原型继承中需要使用Object.create()设置子构造函数原型
为什么JS原型继承要用
Object.create而非直接赋值父类原型 这个问题的核心是避免父类和子类的原型对象指向同一块内存空间,导致子类对原型的修改污染父类。
我们可以分两种情况对比效果:
如果你直接写 Student.prototype = Person.prototype
此时两个构造函数的prototype属性指向完全相同的对象,没有层级隔离:
- 后续你给
Student.prototype添加任何子类专属的属性/方法,比如给学生加个study()方法,所有Person的实例也会拥有这个方法,这完全不符合继承的设计逻辑——普通人类不需要学生的专属方法。 - 同时两者的
constructor属性会完全混淆,你无法通过实例的constructor正确判断它是由Student还是Person构造的。
用 Object.create(Person.prototype) 的作用
Object.create会创建一个全新的空对象,且这个新对象的内部原型(__proto__)指向Person.prototype。这样做的好处是:
- 子类
Student的原型是独立的对象,你在上面添加的任何属性方法只会影响学生实例,不会污染到父类Person的原型。 - 原型链依然是通的:学生实例找不到的属性方法,依然会顺着原型链往上找
Person.prototype上的内容,继承的需求也能满足。
举个直观的错误示例你就懂了:
// 错误写法:直接赋值原型 function Person(){} function Student(){} Student.prototype = Person.prototype // 给学生加专属方法 Student.prototype.study = function(){console.log('我在学习')} const person = new Person() person.study() // 居然能执行,输出"我在学习",这显然不符合预期
如果换成Object.create的写法,上面的person.study()就会直接报错,符合我们对继承的设计要求。
内容的提问来源于stack exchange,提问作者Vahid
相关产品推荐
相关产品推荐

