gpt4 book ai didi

javascript - 如何克隆 ES6 类对象构造函数?

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

使用 ES6 类制作一个简单的 ORM,我在运行时遇到了阻塞问题 – 我无法正确复制类(就像我在 ES5 中使用 util.extend 所做的那样)。

具体来说,这是我尝试过的:

class BaseModel {

echo() {
console.log(this.props);
}

static _setProperties(props) {
this.props = props;
}

}

function makeModel(props) {

// Try to copy the Class object
const Model =
Object.assign(Object.create(Object.getPrototypeOf(BaseModel)), BaseModel);

// Copy my static methods – is there a better way to do this?
Object.getOwnPropertyNames(BaseModel).forEach((key) => {
if (!key.startsWith('_')) return;
Model[key] = BaseModel[key];
});

// Configure the new model
Model._setProperties(props);
return Model;
}

const GreeterModel = makeModel('hello');
const greeter = new GreeterModel();
greeter.echo(); // Should log hello

我得到的错误是:

TypeError: GreeterModel is not a constructor

有没有办法用 ES6 类来实现这一点,还是我必须坚持 ES5 风格?

可选问题是否有更好的方法来复制静态方法?使用 getOwnPropertyNames 的解决方案并不理想,因为它还返回只读属性,例如 length

谢谢!

最佳答案

您的基类中存在逻辑错误。 this 始终取决于函数的调用方式。通常在构造函数上调用静态函数,即 BaseModel._setProperties(...) 在这种情况下 this 引用 BaseModel。然而,实例方法是在实例本身上调用的,因此 this 引用的是实例而不是构造函数。

要使 BaseModel 工作,您必须使用

echo() {
console.lof(this.constructor.props);
}

但要回答您的实际问题,您可以简单地扩展该类:

function makeModel(props) {
class Model extends BaseModel {}
Model._setProperties(props);
return Model;
}

请注意,这不是“克隆”基类,而是扩展它。在 JavaScript 中没有合理的方法来克隆函数(至少到目前为止还不是)。

关于javascript - 如何克隆 ES6 类对象构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46394315/

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