扩展函数不调用基础构造函数

Extend function does not call the base constructor

我有一个组件系统,它应该从名为 component 的基础对象扩展而来。

可以通过名为 registerComponent() 的函数注册新组件。此函数采用一个参数 - 子 class - 并且应该将父 class component 注入其中。

下面的代码几乎可以处理这种情况,问题是永远不会调用 component 构造函数:

// Base component.
function component() { 
  this.visible = false; 
  console.log('Construct component.'); 
}
component.prototype.isVisible = function() { 
  console.log('visibility:', this.visible); 
}

// Custom component that will be extended in a moment.
function button() { 
  this.caption = 'button'; 
  console.log('Construct button.'); 
}

// This is the function I need help with:
function registerComponent(obj) {
  function dynamicComponent() { 
    component.call(this); 
    obj.call(this);
  }

  dynamicComponent.prototype = Object.create(component.prototype);
  obj.prototype = Object.create(dynamicComponent.prototype);
  obj.prototype.constructor = obj;
}

// Now we register the button, which should add two things: 
// the property "this.visible"
// the method "this.isVisible()"
registerComponent(button);

// The test:
b = new button(); // Output is "Construct button."
                  // but not "Construct component." 
b.isVisible();    // Output is "visibility: undefined"

在上面的代码中,方法 component.prototype.isVisible() 被正确地注入到按钮中。但是,未调用构造函数,因此 属性 this.visibleundefined,而不是 false

我在这里错过了什么?

我想你正在寻找

// This is the function I need help with:
function registerComponent(obj) {
  function dynamicComponent() { 
    component.call(this); 
    obj.call(this);
  }

  obj.prototype = dynamicComponent.prototype = Object.create(component.prototype);
  obj.prototype.constructor = dynamicComponent;

  return dynamicComponent;
}

const button = registerComponent(function() { 
  this.caption = 'button'; 
  console.log('Construct button.'); 
});

const b = new button();

您不能更改现有的 button 函数以使其隐式调用 component