gpt4 book ai didi

javascript - 如何将静态方法分解到自己的文件中并通过 ES6 正确导出?

转载 作者:太空宇宙 更新时间:2023-11-04 03:17:59 24 4
gpt4 key购买 nike

此问题是后续问题 to this one它检查当实例和静态方法变得很大并且使单个类文件太难以使用时如何分解类文件。

这个问题对于实例方法找到了一个很好的答案,但是对于静态工厂函数仍然没有一个好的答案。考虑这个 ES6 类:

const fnCreate = require('./create');
const fnInstanceMethod = require('./instanceMethod');

class Door {
constructor() {
this.species = 'Oak';
this.instanceMethod = fnInstanceMethod; // <-- works great
}

// Cannot connect static to required files...
static create = fnCreate; // Syntax error unexpected '='

// so static has to be written in class..
static create() {
return new Door(); // <-- the only line in fnCreate
}
}
module.exports = Door; // but it exports and works fine...

你可以看到在静态函数中只需要 require 会非常好,但我还没有找到使用 ES6 这样做的方法;它必须在类文件中实现。 那么,问题 1 共 2 个问题,“有没有办法在工厂函数中引入 require 并将其静态地连接到 ES6 类中?”

ES6 的“无能”导致我进行了 ES5 重写,如下所示:

const fnCreate = require('./create');
const fnInstanceMethod = require('./instanceMethod');

function Door() {
this.species = 'Oak';
this.instanceMethod = fnInstanceMethod; // <-- works great
}

Door.create = fnCreate; // <-- totally solves the file problem; works fine

module.exports = Door; // <-- NOPE! Node says "Door" is not a constructor"

这避免了一个问题并陷入了另一个问题。在“常规”JS 下,代码可以正常工作,并且 Door.create() 返回一个新的 Door 对象。但导出以某种方式破坏了实现,并出现错误“门不是构造函数”。 第 2 个问题(共 2 个问题),“上述 ES5 代码导出后可以正常工作吗?”

最佳答案

使用 ES6 类,您可以分配给类对象并拥有本质上是静态方法,就像在 ES5 中所做的那样:

class Door {
constructor() {
this.species = 'Oak';
this.instanceMethod = fnInstanceMethod; // <-- works great
}
}
Door.create = fnCreate;

请注意您的

this.instanceMethod = fnInstanceMethod; // <-- works great

虽然它有效,但它可能不是最好的主意 - 如果您想模仿原型(prototype)的标准继承(例如不需要将内容分离到多个文件中时),您应该分配给原型(prototype)对象,就像在 ES5 中一样:

class Door {
constructor() {
this.species = 'Oak';
}
}
Door.create = fnCreate;
Door.prototype.instanceMethod = fnInstanceMethod;

我不确定您遇到的“Door 不是构造函数”错误,但在您当前的实现中,fnCreate(在单独的文件中)不会具有 Door 的范围,因此 fnCreate 将无法引用和创建新 Door。解决此问题的一种方法是导出一个函数,该函数采用 Door 作为输入,并返回一个返回实例的函数:

// makeCreate.js
module.exports = theClass => () => new theClass();

// Door.js
const makeCreate = require('./makeCreate');
const fnInstanceMethod = require('./instanceMethod');
class Door {
constructor() {
this.species = 'Oak';
}
}
Door.create = makeCreate(Door);
Door.prototype.instanceMethod = fnInstanceMethod;

module.exports = Door;

或者,ES5 中的 makeCreate:

function makeCreate(theClass) {
return function() {
return new theClass();
}
}
module.exports = makeCreate;

关于javascript - 如何将静态方法分解到自己的文件中并通过 ES6 正确导出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53717996/

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