我正在NodeJS v8.10(已构建Webpack)中编写的类看起来像是要变得很大。我想将这些方法分解到自己的文件中,但是我也想维护ES6 Class语法,因为我来自OOP背景。
是否有更好的ES6语法来实现其他文件中的类方法?
我目前正在按照下面的代码扩展原型,但是将所有内容放在之内都很好,该类用大括号“ {}”表示。
const fnClose = require('./close');
// about 20 more methods required in here
class Door {
constructor() {}
// close: require('./close'); // this would be nice!
}
/*
it doesn't seem to matter if the exports line comes
BEFORE the prototype extensions; it still exports the
'close' method with the Door class.
*/
// module.exports = Door; // works, just looks wrong here
Door.prototype.close = fnClose;
// about 20 more methods added to class here
module.exports = Door; // the natural place for exports
基于奥利弗在下面的回答中提供的火花,可以将这段代码重构为将方法“置于括号内”,如下所示。这不像我希望的那样“ ES6”。更简洁的语法会很好。但这确实可以完成工作!
const fnClose = require('./close');
// about 20 more methods required in here
class Door {
constructor(...args) {
// PROPERTIES
this.species = 'Oak';
// METHODS - FROM THEIR OWN FILES!
this.close = fnClose; // how to close the door
// CONSTRUCTOR CODE
// <do stuff with args>
}
}
module.exports = Door;
/*
And thats it. everything tucked inside the
class, no need for prototype extenstions.
Does not appear to be a need for Babel though.
*/
答案 0 :(得分:3)
正如詹姆斯·索普(James Thorpe)指出的那样,可能是您的课程本身变得太大了。话虽如此,如果您使用的是babel,那么您可以对字段进行分类以实现至少在我看来可以达到相同效果的东西:
function test() {
console.log('called test')
console.log(this.value)
}
class TestClass {
value = "This is the test value";
runTest = test;
}
const x = new TestClass();
x.runTest()
没有babel,您不能使用类变量,因为js尚不支持它们。 There is a proposal(在撰写本文时处于第三阶段),babel可以为我们进行移植。
上面的代码片段使用babel来使工作正常。您在评论中询问babel是否只是将其转换为与您相同的代码。它是相似的,但在一些关键方面有所不同。 Babel(使用他们的沙箱)将其转换为此:
"use strict";
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function test() {
console.log('called test');
console.log(this.value);
}
var TestClass = function TestClass() {
_classCallCheck(this, TestClass);
this.value = "This is the test value";
this.runTest = test;
};
var x = new TestClass();
x.runTest();
因此它根本不使用类语法。请记住,在任何情况下javascript中的class
都是语法糖,因此在任何情况下使用class
都会在幕后发生类似的事情。
Babel似乎确实需要插件,详细信息请here.