2016-10-21 13 views
-1

クラス内にメソッドを定義する方法は2つあります。クラスメソッド - どちらを使用するのか?

class Foo { 
    handleClick = e => { 
     // handle click 
    } 
    // and 
    handleHover(e) { 
     // handle hover 
    } 
} 

私の質問は2つの違いは何ですか? transpiledとき

、彼らは明らかに異なる結果を与える:

var _createClass = function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 

var Foo = function() { 
    function Foo() { 
     _classCallCheck(this, Foo); 

     this.handleClick = function (e) {} 
     // handle click 

     // and 
     ; 
    } 

    _createClass(Foo, [{ 
     key: "handleHover", 
     value: function handleHover(e) { 
      // handle hover 
     } 
    }]); 

    return Foo; 
}(); 

をしかし、私は違いが何であるかを見分けるように見えることはできません。それは拘束力のある問題ですか?

ありがとうございます!

+1

を参照してください。メソッド構文は、関数式の文法的な砂糖です。 –

+0

入手しました。ありがとう! – abustamam

+0

ここでは複製が実際には適用されないので、質問を再開しました。あなたのコードは有効なES6ではないことに注意してください。将来のバージョンのESで機能提案を使用します。 –

答えて

3
class Foo { 
    handleClick = e => { 
     // handle click 
    } 
} 

はES6ではありません。 It's a proposal for a future version of ES

あなたの一例に相当ES5コードが

class Foo { 
    constructor() { 
     this.handleClick = e => { 
      // handle click 
     } 
    } 
    // and 
    handleHover(e) { 
     // handle hover 
    } 
} 

だろうし、あなたの一例に相当ES6コードは、したがって、基本的​​は、インスタンスにautoboundさ

function Foo() { 
    this.handleClick = function(e) { 
     // handle click 
    }.bind(this); 
} 

Foo.prototype.handleHover = function(e) { 
    // handle hover 
} 

、役立つことができだろうイベントハンドラの場合は、すべてのインスタンスに対して新しい関数を作成することになります。詳細については

は、それは矢印機能と機能発現の間だけの違いだ

+0

ああ、面白いです。私は私のバベルREPLで「ステージ2」を刻んだことに気付かなかった。それを取り消すと構文エラーが発生しました。これは意味があります。したがって、本質的には「autobinds」ですが、 'new'が呼び出されるたびに新しい関数を作成します。ありがとう! – abustamam

+1

「自動バインディング」は、「クラスフィールド」を使用せずに矢印機能を使用した結果であることに注意してください。私。 'handleClick = function(){}'はコンストラクタ内で関数を定義しますが、オートバインドを取得しません。 –

関連する問題