ES5环境下子类对象无法直接调用父类原型方法的问题及解决
你的原型继承写法完全错误,修正方案如下
核心问题分析
- 原型链断裂:你给
OtherWall.prototype赋值的对象中,constructor: Object.create(Wall.prototype)完全搞错了继承逻辑。正确的继承应该让OtherWall.prototype直接以Wall.prototype为原型,而不是把继承关系塞到constructor属性里。你当前的写法导致OtherWall实例的原型是一个普通对象,根本没和Wall.prototype建立关联,自然找不到show方法。 - bind(this)的错误:在对象字面量里给
shouldShowWall方法绑定this时,这里的this是全局上下文(浏览器为window,Node.js为global),不是OtherWall的实例。绑定后方法里无法访问实例的item、minutes属性。
修正后的子类代码
function OtherWall() { // 调用父构造函数,确保父类初始化逻辑执行(如果有) Wall.call(this); this.item = 'my_tracking_id'; this.minutes = 30; // ... } // 1. 让OtherWall原型继承自Wall原型,建立正确的原型链 OtherWall.prototype = Object.create(Wall.prototype); // 2. 修正constructor指向,保证instanceof判断正确 OtherWall.prototype.constructor = OtherWall; // 3. 重写子类的shouldShowWall方法 OtherWall.prototype.shouldShowWall = function() { // 这里可以正常访问this.item、this.minutes // 示例逻辑:根据minutes判断是否显示 return this.minutes > 0; }; module.exports = OtherWall;
修正逻辑说明
Object.create(Wall.prototype):创建一个以Wall.prototype为原型的新对象,赋值给OtherWall.prototype,这样OtherWall的实例就能通过原型链访问到Wall.prototype上的show方法。- 修正
constructor:Object.create生成的对象默认constructor指向Wall,手动改回OtherWall可以保证new OtherWall() instanceof OtherWall返回true,符合预期。 - 直接赋值方法:此时
shouldShowWall里的this在调用时会自动指向OtherWall的实例,无需提前绑定。
测试调用
new OtherWall().show(); // 现在可以正常执行,会优先调用子类的shouldShowWall,再执行父类的show逻辑
内容的提问来源于stack exchange,提问作者Dale Woods
相关产品推荐
相关产品推荐

