gpt4 book ai didi

javaScript - ES6 中的多重继承,

转载 作者:行者123 更新时间:2023-11-29 19:02:39 32 4
gpt4 key购买 nike

我正在尝试继承类“EventEmitter”和一个预定义的类“Person”,这是代码

class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
introduces() {
return `My name is ${this.name}. I am ${this.age} years old.`;
}
};

\\here comes the mixin part

function mix(...mixins) {
class Mix {}
for (let mixin of mixins) {
copyProperties(Mix, mixin);
copyProperties(Mix.prototype, mixin.prototype);
}
return Mix;
}

function copyProperties(target, source) {
for (let key of Reflect.ownKeys(source)) {
if (key !== "constructor" && key !== "prototype" && key !== "name") {
let desc = Object.getOwnPropertyDescriptor(source, key);
Object.defineProperty(target, key, desc);
}
}
}

我打算创建一个新类“PersonWithEmitter”,并且仍然像下面这样调用构造函数:

class PersonWithEmitter extends mix(Person,EventEmitter){
constructor(name,age){
super(name,age)
\\do something else
}

问题来了,当我像这样创建一个新的“PersonWithEmitter”实例时 let someOne = new PersonWithEmitter("Tom",21), 不会得到我想要的,在新的类,我想使用 this.namethis.age,它仍然是未定义的。那么我怎样才能改变我的代码,让新类既有它的父类的方法又只有类“Person”的构造函数?请原谅我蹩脚的英语。

最佳答案

在许多情况下,JavaScript 中的多重继承表示错误的设计决策。它可能会导致对象的行为不正常。它的完成方式应始终由特定对象决定。在某些情况下,需要自己属性的浅拷贝,在另一种情况下,应该遍历整个原型(prototype)链。 Composition over inheritance通常是更好的选择。

上面代码中的问题是没有调用类的构造函数。 Mix 的构造函数为空。这就是为什么 PersonWithEmitter 没有按预期工作的原因。

多个构造函数调用一般可以这样堆叠:

function Foo(...args) {
let _this = this;
_this = Bar.apply(_this, args);
_this = Baz.apply(_this, args);
return _this;
}

如果 BarBaz 是 ES6 类,这将不起作用,因为它包含一种机制,可以防止在没有 new 的情况下调用它。在这种情况下,它们应该被实例化:

function Foo(...args) {
copyProperties(this, new Bar(...args));
copyProperties(this, new Baz(...args));
}

静态和原型(prototype)属性也可以复制到 Foo,如上面的代码所示。

如果情况缩小到 Node.js EventEmitter,则可以像处理特殊情况一样处理。它的实现是certain稳定。众所周知,EventEmitter 在构造函数中进行初始化,它具有浅原型(prototype)链和属性描述符。所以它可能应该是:

class Foo extends Bar {
constructor(...args) {
super(...args)
EventEmitter.call(this);
// or
// EventEmitter.init.call(this);
}
copyProperties(Foo.prototype, EventEmitter.prototype);

关于javaScript - ES6 中的多重继承,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45740078/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com