Node + ES6 + Babel未定义类方法

Adv*_*iov 2 javascript node.js ecmascript-6 babeljs

我正在尝试在ES6中运行快速应用程序.我正在使用以下工作流程:

  1. 使用以下gulp任务(在.babelrc中使用"es2015""stage-0"预设)将ES6透明到ES5 :

    import gulp from 'gulp';
    import gulpBabel from 'gulp-babel';
    import sourcemaps from 'gulp-sourcemaps';
    
    gulp.task('babel', () => {
        gulp.src([
                'someClass.js',
                'app.js'
            ], {base: './', dot: false})
            .pipe(sourcemaps.init())
            .pipe(gulpBabel())
            .pipe(sourcemaps.write('.'))
            .pipe(gulp.dest('./dist'));
    });
    
    Run Code Online (Sandbox Code Playgroud)

    这似乎工作得很好.

  2. node dist/app.js.

  3. 以下代码位于someClass.js:

    export default class SomeClass {
    
        someMethod() {
            return 1 + 1;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 最后,以下代码位于app.js:

    import SomeClass from './someClass';
    
    //express config
    
    console.log(SomeClass);
    console.log(SomeClass.someMethod);
    
    Run Code Online (Sandbox Code Playgroud)

哪些日志:

[Function: SomeClass]
undefined
Run Code Online (Sandbox Code Playgroud)

这是相关的转换代码:

DIST/app.js

var _someClass = require('./someClass');

var _someClass2 = _interopRequireDefault(_someClass);

console.log(_someClass2.default);
console.log(_someClass2.default.someMethod);
Run Code Online (Sandbox Code Playgroud)

DIST/someClass.js

var SomeClass = function () {
    function SomeClass() {
        _classCallCheck(this, SomeClass);
    }

    _createClass(SomeClass, [{
        key: "someMethod",
        value: function someMethod() {
            return 1 + 1;
        }
    }]);

    return SomeClass;
}();

exports.default = SomeClass;
Run Code Online (Sandbox Code Playgroud)

为什么不someMethod定义?

Shu*_*awa 7

因为someMethod是一个实例方法.您需要new使用该方法实例化该类.

const something = new SomeClass();
something.someMethod();
Run Code Online (Sandbox Code Playgroud)

如果要在不实例化类的情况下使用该方法,可以将其定义为静态方法.

export default class SomeClass {

    static someMethod() {
        return 1 + 1;
    }
}

SomeClass.someMethod();
Run Code Online (Sandbox Code Playgroud)

在上面的评论中,您说您想将其用作回调.要将其用作回调,如果在方法中使用this关键字,则可能需要将上下文绑定到方法.否则,this关键字在被称为回调函数时不会指向该实例.

var something = new SomeClass();
element.addEventListener('click', something.someMethod.bind(something));
// or
element.addEventListener('click', (event) => something.someMethod(event));
Run Code Online (Sandbox Code Playgroud)