You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中仅继承父构造函数的部分参数

这个问题我太有共鸣了!直接重写属性确实有点别扭,给你几个更优雅的实现方案:

方案一:调用父构造函数时传入占位值

既然你不需要继承velX和velY,那在调用Shape.call()的时候,直接给这两个参数传undefined就行——父构造函数会把这两个属性设为undefined,但你之后在子构造函数里直接定义自己的velX,相当于“初始化”而非“重写”,逻辑更顺:

function EvilCircle(x, y, exists) {
  // 用undefined占位不需要的velX、velY参数
  Shape.call(this, x, y, undefined, undefined, exists);
  this.velX = 10;
  // 其他子构造函数的逻辑...
}

这样既复用了父构造函数中x、y、exists的初始化逻辑,又不会留下冗余的属性,比事后重写清爽多了。

方案二:改用ES6 Class语法(更直观易读)

如果你的项目允许使用ES6+语法,Class继承会让逻辑更清晰。直接在super()里传入需要的参数,用undefined占位不需要的部分,再在子类构造函数里定义自己的属性:

class Shape {
  constructor(x, y, velX, velY, exists) {
    this.x = x;
    this.y = y;
    this.velX = velX;
    this.velY = velY;
    this.exists = exists;
  }
}

class EvilCircle extends Shape {
  constructor(x, y, exists) {
    // 仅传入需要继承的参数,其余用undefined占位
    super(x, y, undefined, undefined, exists);
    this.velX = 10;
    // 其他子类专属逻辑...
  }
}

Class语法本身就更符合面向对象的写法,这种实现完全贴合“只继承需要的参数”的需求,可读性拉满。

额外小技巧:若能修改父构造函数

要是你有权限修改Shape构造函数,可以给velX和velY添加默认值,这样调用时甚至可以直接省略这两个参数:

// 修改后的父构造函数
function Shape(x, y, velX = undefined, velY = undefined, exists) {
  this.x = x;
  this.y = y;
  this.velX = velX;
  this.velY = velY;
  this.exists = exists;
}

// 子构造函数调用时直接省略不需要的参数
function EvilCircle(x, y, exists) {
  // 连续逗号代表占位,或者直接传3个参数也可(因为后面有默认值)
  Shape.call(this, x, y, , , exists);
  this.velX = 10;
}

不过这个方案的前提是你能修改父构造函数,如果Shape是第三方库的构造函数,那还是前两个方案更稳妥。

内容的提问来源于stack exchange,提问作者ilmix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:08:17