如何在javascript中扩展现有的构造函数

How to extend existing constructor function in javascript?

本文关键字:构造函数 扩展 javascript      更新时间:2023-09-26

让我们假设我有以下对象函数:

function A(options){
 ...
}

然后我想创建一个新的函数(B),它继承了a的原型。这些是我正在寻找的条件:

  • 如果修改了B的原型,则不应修改A的原型
  • 当作为构造函数调用B函数时,应该使用相应的选项来调用a的构造函数

B应该是这样的:

函数B(aOptions,bOptions){…}

var b = new B({}, {})

只需使用this 调用A构造函数

function B(aOptions, bOptions) {
  A.call(this, aOptions);
  // do stuff with bOptions here...
}

现在设置原型

B.prototype = Object.create(A.prototype, {
  constructor: {
    value: B
  }
});

现在B将拥有来自A.的原型方法

添加到B的原型中的任何新方法都将不可用于A的原型


还有一些其他的调整也可以让你的生活更轻松。

function A(options) {
  // make `new` optional
  if (!(this instanceof A)) {
    return new A(options);
  }
  // do stuff with options here...
}

对B 也这样做

function B(aOptions, bOptions) {
  // make `new` optional
  if (!(this instanceof B)) {
    return new B(aOptions, bOptions);
  }
  // call parent constructor
  A.call(this, aOptions);
  // do stuff with bOptions here...
}

现在您可以调用A(options)new A(options)来获得相同的结果。

与B相同,B(aOptions, bOptions)new B(aOptions, bOptions)将得到相同的结果。