使用ES6类语法,如何从其他文件实现类方法?

时间:2018-11-07 11:04:38

标签: javascript node.js es6-class

我正在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.
*/

1 个答案:

答案 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.