最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - ES6: Applying function as class method - Stack Overflow

programmeradmin3浏览0评论

I'm migrating a project from CoffeeScript to ES6 (using 6to5 and Browserify), and am running into possibly a limitation or maybe I just don't know the proper syntax. In CoffeeScript I could do this:

class SomeView extends BaseView
    triggerMethod: Marionette.triggerMethod

How do I express this in ES6 classes? I tried a couple of things, but it throws Unexpected token errors no matter what I try. This for example:

let { triggerMethod } = Marionette;

class SomeView extends BaseView {
    triggerMethod, // doesn't work
    triggerMethod: Marionette.triggerMethod // doesn't work
}

Now I can achieve this by setting it in the constructor (this.triggerMethod = Marionette.triggerMethod), but it feels a bit ugly to me (just a preference in coding style I guess). Any help would be appreciated.

I'm migrating a project from CoffeeScript to ES6 (using 6to5 and Browserify), and am running into possibly a limitation or maybe I just don't know the proper syntax. In CoffeeScript I could do this:

class SomeView extends BaseView
    triggerMethod: Marionette.triggerMethod

How do I express this in ES6 classes? I tried a couple of things, but it throws Unexpected token errors no matter what I try. This for example:

let { triggerMethod } = Marionette;

class SomeView extends BaseView {
    triggerMethod, // doesn't work
    triggerMethod: Marionette.triggerMethod // doesn't work
}

Now I can achieve this by setting it in the constructor (this.triggerMethod = Marionette.triggerMethod), but it feels a bit ugly to me (just a preference in coding style I guess). Any help would be appreciated.

Share Improve this question asked Jan 28, 2015 at 10:30 StevenSteven 1,5962 gold badges16 silver badges39 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 15

You can't declare properties in ES6 classes, only methods and static methods (see here for syntax of class declaration, pay attention to ClassElement). So any of the following examples will be wrong:

class A {
    method1: B.someMethod  // wrong!
    method2: function() {} // wrong!
    method3: () => {}      // wrong!
}

You have several variants to handle your problem:

  1. Use getter:

    class SomeView extends BaseView {
        get triggerMethod() { return Marionette.triggerMethod }
    }
    
  2. Call Marionette.triggerMethod from triggerMethod of SomeView class:

    class SomeView extends BaseView {
        triggerMethod() { 
            Marionette.triggerMethod.apply(this, arguments);
        }
    }
    
  3. Add triggerMethod to the prototype of SomeView after class declaration:

    class SomeView extends BaseView {
        //.. some class declaration
    }
    SomeView.prototype.triggerMethod = Marionette.triggerMethod;
    

    or with Object.assign:

    class SomeView extends BaseView {
        //.. some class declaration
    }
    
    Object.assign(SomeView.prototype, {
      triggerMethod: Marionette.triggerMethod
      // ... some another methods
    });
    
  4. What you already did - add Marionette.triggerMethod to the this. But you must be aware that in that case triggerMethod will be kept in the object itself, not in its prototype. Example:

    class SomeView extends BaseView {
        constructor() {
          this.triggerMethod =  Marionette.triggerMethod
          // ...
        }
    }
    

That's all you can do. I think the first and second variants are the best choices for your case, but it's a matter of taste.

If I got this right you can define class methods this way:

class SomeView extends BaseView {
    triggerMethod(){
      Marionette.triggerMethod; 
   }
}

Pretty much the same as in coffeeScript, but some braces are required. I haven't tried this, but see http://wiki.ecmascript/doku.php?id=harmony:classes

发布评论

评论列表(0)

  1. 暂无评论