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
相关产品推荐
相关产品推荐

