Javascript 基于另一个类的构造函数生成新类
有没有办法重用现有ES6类的构造函数来生成另一个类?(请原谅我没有OOP短语)我想要实现的是,在运行时生成新类,合并已经初始化的类,就像mixin,但以动态方式。以下是我的成就:Javascript 基于另一个类的构造函数生成新类,javascript,es6-class,Javascript,Es6 Class,有没有办法重用现有ES6类的构造函数来生成另一个类?(请原谅我没有OOP短语)我想要实现的是,在运行时生成新类,合并已经初始化的类,就像mixin,但以动态方式。以下是我的成就: function A(value){ this.a = value; } A.prototype.doA = function() { console.log(this.a); } class B { constructor(value){ this.b = value
function A(value){
this.a = value;
}
A.prototype.doA = function() {
console.log(this.a);
}
class B {
constructor(value){
this.b = value;
}
doB() {
console.log(this.b);
}
}
function morphed(OldClass){
let newClass = function(){
// ----------------------
// this throws an error on "B"
OldClass.prototype.constructor.call(this, ...arguments)
// ----------------------
this.c = 1;
}
const newPrototype = { doC: function(){ console.log(this.c) } }
newClass.prototype = Object.assign({}, OldClass.prototype, newPrototype);
return newClass;
}
const C = morphed(A);
const c = new C('123');
我知道,这个例子完全丢失了A或B的继承函数,但这对于我的用例来说没关系。使用基于函数的类“A”,一切正常,但当我尝试访问“B”的构造函数时,我得到一个错误:
Cannot call a class as a function
如何访问已存在类的构造函数作为函数
更新:
对于那些提出要求的人来说,目标是注入类似于继承的东西,但不改变初始类。类似于mixin,但在运行时生成,因此可以链接多个类。也许这可以更好地解释:
const el = scrollable(draggable(collapsable(document.querySelector('.class') )));
const collapsable = function(el){
if(!el.isInitialized)
return new Collapsable(el);
else{
return injectPrototypeIntoPrototypeChain(el, Collapsable);
}
}
更新2:
好的,这是我最后一次尝试:也许这只是我对JS原型链的误解,不知何故我认为这应该是可能的:(变量名是独立于前面的代码片段选择的)
我所有的尝试都以巴贝尔告诉我“不能将类作为函数调用”或覆盖实例的原型链而告终。也许我最初的问题应该是
如何将实例化对象的原型链附加到具有自己的原型链的新对象
@Bergi事实上,这混淆了类和实例级别。我对流行的“mixin”模式的问题是,单个属性可能会被覆盖,而且(据我所知)很难对Object.assign进行操作,即使用具有5层继承性的对象。如果要继承,请使用
class newClass Extendes OldClass{…}
。如果您只想使用构造函数,这是不容易做到的,而且无论如何也不应该这样做。请查看和以及解决方法。示例代码中的newPrototype
和Class
是什么?它们在任何地方都没有定义。感谢@Bergi提供的链接,还更正了code@Schnurbert,我想你是在寻找遗产?您的用例是什么?