2017-12-29 16 views
2

私はとReduxで2年間働いていましたが、私がinheritanceをjavascriptで使用していたときに、javascriptでこれらの2種類の関数宣言の違いがわかりました。クラス内のjavascriptでの関数宣言の2種類の違いはありますか?

私はクラスaとクラスaから継承し、私は次のコードを実行している時はいつでも、それは私が構文bfunc = function(){thisに機能を置くことを前提としてい

bfunc called from class a 
afunc called from class b 

をログアウトクラスbをしましたafunc() {という構文は関数をクラスのプロトタイプに入れていますが、私はあまりよく分かりません。誰かがこの行動を説明できますか?

class a { 
 
    afunc() { 
 
    console.log('afunc called from class a'); 
 
    } 
 

 
    bfunc = function() { 
 
    console.log('bfunc called from class a'); 
 
    } 
 
} 
 

 
class b extends a { 
 
    afunc() { 
 
    console.log('afunc called from class b'); 
 
    } 
 

 
    bfunc() { 
 
    console.log('bfunc called from class b'); 
 
    } 
 
} 
 

 
const bObject = new b(); 
 
bObject.bfunc(); 
 
bObject.afunc();

bfunc called from class a 
afunc called from class b 

答えて

3

あなたの仮定が正しいです。 console.log(bObject);を実行すると、その機能を含む独自のbfuncプロパティがあることがわかります。

オブジェクトは独自のプロパティを持たない場合にのみプロトタイプが使用されるため、親クラスによって配置されていてもプロトタイプが優先されます。

2

@Barmarは彼の答えで、かつ詳細に述べたように:

をこれはあなたのコードのは、にtranspiled何であるバベルの使用: [Follow the link]

あなたは、コードのtranspiledバージョンを美化した場合、あなたは次のように関数を定義することがわかります:

bfunc = function() { 
    // 
    } 

するthisに機能を追加します。
ながら:

bfunc() { 
    // 
    } 

はプロトタイプに追加されます、それは自己:

b.prototype.bfunc = function() { 
    //do something 
}; 

thisを使用してbfuncを呼び出すとprototypeよりも優先される理由についてlook here for more detailsしてください。

関連する問題