2016-07-20 18 views
0

ここには、typescriptコードと生成される対応するJavaScriptがあります。 なぜ、microsoftはvarを使用する代わりにthis.greetingを使用し、生成されたjsコードで外部から変数にアクセスしないようにしましたか? typescriptですの民間へのプロパティを変更するだけでコンパイルエラーがスローされますが、jsの生成されたコードは、早い段階でprivateキーワードの周りの議論の大きな取引がありました同上Typescriptの非公開

//typescript code 
 
class Greeter { 
 
    greeting: string; //why is this not private by default??? 
 
    constructor(message: string) { 
 
     this.greeting = message; 
 
    } 
 
    greet() { 
 
     return "Hello, " + this.greeting; 
 
    } 
 
} 
 

 
let greeter = new Greeter("world"); 
 
console.log(greeter.greeting); //why the heck is 'greeting accessible' 
 

 
//Generated javascript as follows 
 
var Greeter = (function() { 
 
    function Greeter(message) { 
 
     this.greeting = message; //this should have been a var ???? 
 
    } 
 
    Greeter.prototype.greet = function() { 
 
     return "Hello, " + this.greeting; 
 
    }; 
 
    return Greeter; 
 
}()); 
 
var greeter = new Greeter("world"); 
 
console.log(greeter.greeting); //why the heck is 'greeting accessible'

答えて

2

です。 TypeScriptチームは、非常に大きなアプリケーションでこれのパフォーマンスコストを考え、それが大きすぎると信じていました。

多くのアプリケーションでパフォーマンスコストは無視できますが、TypeScriptを使用して数百万のLOCアプリケーションを構築するケースがあり、コンパイルされたJavaScriptが変数を実際に隠そうとした場合にはprivate変数を使用できなくなります。

コンストラクタ関数に プライベートストレージ用のローカル変数を使用しての問題は、彼らが(JavaScriptを生成 になったクラスにどのような方法である) プロトタイプオブジェクトに関数からアクセスすることができないということです。代わりにあなたが オブジェクトのローカル関数を作成する必要があり、それはより多くのメモリ

を消費します(アンダースHejlsbergの答えと一緒に)元TypeScript Codeplex siteにあなたの質問の私のバージョンを見ることができます。

1

varを使用すると、指定されたスコープで変数が表示されるだけですが、その問題はclassを拡張する必要がある場合に発生し、新しいクラスでその変数にアクセスする方法はありません。

関連する問題