2016-10-27 13 views
2

私の次のコードは動作していますが、私はES6の構文を使用するともう動作しません。何が起きているのか説明してください。なぜこのjavascriptスニペットが機能していないのですか?

このコードは完全に機能しています。

function Library(){ this.books = [];}; 
    Library.prototype.addBook = function(book){ 
    this.books.push(book); 
    }; 

    Library.prototype.getBook = function(index){ 
    return this.books[index]; 
    }; 

    var m = new Library(); 
    m.addBook('The Demon Haunted World');  
    m.getBook(0); 
    // output will be like 'The Demon Haunted World' 

次に、構文をある程度ES6に変更しました。 コードは、このように見えた:

function Library(){ this.books = [];}; 
    Library.prototype.addBook = (book) => { 
    this.books.push(book); 
    }; 

    Library.prototype.getBook = (index) => { 
    return this.books[index]; 
    }; 

    var m = new Library(); 
    m.addBook('The Demon Haunted World'); 

は、なぜこれが動作しませんか?私は次のエラーを取得しています:

VM505:2 Uncaught TypeError: Cannot read property 'push' of undefined(…) 
+3

可能な複製(http://stackoverflow.com/questions/31095710/methods-in-es6-objects-using-arrow-functions) – JJJ

+0

これのdontはあなたを表すため、オブジェクト – Beginner

答えて

5

thisはウィンドウではなくLibraryコンストラクタに属します。これは、矢印関数bindsのコンテキストlexicallyとウィンドウオブジェクトまたは環境がparentであるために発生します。

function Library(){ this.books = [];}; 
    Library.prototype.addBook = (book) => { 
    console.log(this); //window 
    this.books.push(book); 
    }; 

JSでは、通常、2つのコンテキスト/スコープ[グローバル、機能]があります。あなたの場合、arrow関数はwindow contextまたはnearest parent context.のウィンドウを指しています。 [ES6オブジェクトのメソッド:矢印機能を使用]の

+1

問題を正しく検出しましたが、説明が非常に不正確です。矢印関数の 'arguments'、' super'、 'this'および' new.target'への参照は、字句的に囲む環境でのバインディングに常に解決されます。それで全部です。コンテキストなし、スコープなし、ウィンドウなし。 JSには2つ以上のタイプのスコープがあります。少なくともグローバル、モジュール、関数、ブロック、および反復スコープです。 – zeroflagL

+2

ES6は... ES5、その唯一の関数/グローバル...あなたは動的なコンテキストを作成することができますevalを使用している可能性があります/キャッチ独自のスコープを持って... – Thalaivar

関連する問題