gpt4 book ai didi

javascript - ES6 类中的访问器组合

转载 作者:行者123 更新时间:2023-11-28 12:22:25 25 4
gpt4 key购买 nike

假设我有一个 Thing 类,我希望它既是 Hideable 又是 Openable

使用与 Douglas Crockford's 类似的方法通过组合创建对象,我已经能够从多个类“继承”。

此方法不适用于访问器(getter/setter)。

我需要使用类,因为这是一个要求。我还发现我在类之间复制功能,但我不希望这些从基类继承。

有什么想法吗?

到目前为止我所取得的进展在下面的代码片段中:

class Openable {

constructor(isOpen = false) {
this._isOpen = isOpen;
}

get isOpen() {
return this._isOpen + ' is stupid.';
}

set isOpen(value) {
this._isOpen = value;
}

}


class Hideable {

constructor(isHidden = false) {
this._isHidden = isHidden;
}

get isHidden() {
return this._isHidden + ' is stupid.';
}

set isHidden(value) {
this._isHidden = value;
}

}


class Thing {

constructor(config) {
let { isOpen, isHidden } = config;

let openable = new Openable(isOpen);
this.isOpen = openable.isOpen;

let hideable = new Hideable(isHidden);
this.isHidden = openable.isHidden;
}

}


let thing = new Thing({
isOpen: true,
isHidden: false
});

最佳答案

因为 isOpenisHidden访问器,所以你不能只获取它们的副本,你必须在需要时访问它们他们。

不过,您仍然可以创建自己的自己的 isOpenisHidden,它们使用底层的:

let openable = new Openable(isOpen);
Object.defineProperty(this, "isOpen", {
get: () => openable.isOpen,
set: value => {
openable.isOpen = value;
}
});

let hideable = new Hideable(isHidden);
Object.defineProperty(this, "isHidden", {
get: () => hideable.isHidden,
set: value => {
hideable.isHidden = value;
}
});

Live example on Babel's REPL

当然,如果您经常这样做,您会希望有一个工作函数来设置它,而不是一直重新输入:

function wrapProperty(dest, src, name) {
Object.defineProperty(dest, name, {
get: () => src[name],
set: value => { src[name] = value; }
});
}

(或者通过获取属性描述符并更新它来实现)

然后:

wrapProperty(this, openable, "isOpen");
wrapProperty(this, hideable, "isHidden");
<小时/>

我对您必须使用class作为OpenableHideable的要求表示质疑。对我来说,它们看起来更像是 mixin。

关于javascript - ES6 类中的访问器组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35064677/

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