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

Pat*_*oco 1 javascript

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

function A(options){
 ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

B应如下所示:

功能B(aOptions,bOptions){...}

var b = new B({}, {})
Run Code Online (Sandbox Code Playgroud)

Tha*_*you 8

只需调用A构造函数this

function B(aOptions, bOptions) {
  A.call(this, aOptions);

  // do stuff with bOptions here...
}
Run Code Online (Sandbox Code Playgroud)

现在设置原型

B.prototype = Object.create(A.prototype, {
  constructor: {
    value: B
  }
});
Run Code Online (Sandbox Code Playgroud)

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

添加到B原型的任何新方法都无法用于A的原型


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

function A(options) {

  // make `new` optional
  if (!(this instanceof A)) {
    return new A(options);
  }

  // do stuff with options here...
}
Run Code Online (Sandbox Code Playgroud)

为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...
}
Run Code Online (Sandbox Code Playgroud)

现在您可以致电A(options)new A(options)获得相同的结果.

与B相同,B(aOptions, bOptions)或者new B(aOptions, bOptions)会得到相同的结果.