2017-06-30 2 views
0

なぜ、これは他のほとんどの言語でもうまくいかないでしょう。ES6ではなぜこれを使わないで兄弟方法を参照できませんか?

class Test { 
    a() { 
     console.log('hi'); 
    } 
    b() { 
     a(); 
    } 
} 

JavaまたはRubyではこれが機能します。 aからbを呼び出すことは、完全にOKですが、Javascriptクラスで行われます。なぜ私はthis.athis.b、これをこれに置きますか?

それの背後にある技術的な理由は何ですか、それは何のメリットですか、それは今のところ変わりつつありますか?計画はありますか?

+4

変更されません。利益は、指定された名前が参照するものに関してJavaScriptの単純な規則を維持することです。なぜなら、 'Test'は' a'を定義していませんが、継承したクラスは 'a()'がまだ 'this.a()'を意味するのでしょうか?) 。 – Ryan

+0

"*それの背後にある技術的な理由*"に関しては、Brendan Eichに尋ねるのが一番です。しかし、彼はわずか10日でECMAscriptになっているものの基礎を書いていて、クラスではなくプロトタイプの継承を実装していたことを覚えておいてください。その答えは「*当時は良いアイデアのように思えました」。 ;-) – RobG

+0

@Ryan子クラスが 'Test'を継承している場合、そのクラスのインスタンスは子の' a'を参照し、 'Test'で定義されているかどうかにかかわらず、'子クラス'。 –

答えて

5

基本的に、JavaScriptにはクラスベースの継承はありません。それは、クラスベースの継承を模倣するためにいくつかの構文的な砂糖でプロトタイプベースの継承を持っています。より一般的に、それは現在の関数がアクセスできる範囲内に存在する別のa()を意味している場合a()this.a()を意味かどうかを判断しようとしていると重大なパフォーマンスの問題があっ

です。そしてそれはb()が呼び出されるたびに毎回変更することができます!

オブジェクトがメソッドa()を持っているからといって、今はそれがまだそのメソッドa()を持っているとは限りません。オブジェクトからメソッドを削除し、オブジェクトに新しいメソッドを追加することができます。

呼び出す対象の関数がどれかを調べようとすると、基本的に全く同じパフォーマンスの問題が発生するため、withは非推奨になりました—どのメソッドを決定できないため、あなたがそうしようとする瞬間まで呼び出されます。

+0

Rubyには、その場でメソッドを追加できるメタプログラミングがありますが、うまく動作します。 –

+0

@MuhammadUmer:MRIは現代のJavaScriptエンジンに比べて非常に遅いです。 – Ryan

+0

「働いている」ことではありません。言語は機能を持つことができ、機能するが、うまく機能しない。今日でも、あなたのすべてのメソッドを '(with){} 'で囲むことができます。あなたは、あなたが望む動作をかなりのパフォーマンスコストで得るでしょう。 – PMV

関連する問題