TypeScript でのプライベート メンバーの実装を検討していますが、少し混乱しています。Intellisense はプライベート メンバーへのアクセスを許可しませんが、純粋な JavaScript では、すべてそこにあります。これは、TS がプライベート メンバーを正しく実装していないと思わせます。何かご意見は?
class Test{
private member: any = "private member";
}
alert(new Test().member);
TypeScript でのプライベート メンバーの実装を検討していますが、少し混乱しています。Intellisense はプライベート メンバーへのアクセスを許可しませんが、純粋な JavaScript では、すべてそこにあります。これは、TS がプライベート メンバーを正しく実装していないと思わせます。何かご意見は?
class Test{
private member: any = "private member";
}
alert(new Test().member);
型チェックと同様に、メンバーのプライバシーはコンパイラー内でのみ適用されます。
プライベートプロパティは通常のプロパティとして実装され、クラス外のコードはそれにアクセスできません。
クラス内で真にプライベートなものを作成するには、クラスのメンバーにすることはできません。オブジェクトを作成するコード内の関数スコープ内で作成されたローカル変数になります。this
つまり、クラスのメンバーのように、つまりキーワードを使用してアクセスすることはできません。
JavaScript はプライベート変数をサポートしています。
function MyClass() {
var myPrivateVar = 3;
this.doSomething = function() {
return myPrivateVar++;
}
}
TypeScript では、これは次のように表現されます。
class MyClass {
doSomething: () => number;
constructor() {
var myPrivateVar = 3;
this.doSomething = function () {
return myPrivateVar++;
}
}
}
編集
このアプローチは、絶対に必要な場合にのみ控えめに使用する必要があります。たとえば、パスワードを一時的にキャッシュする必要がある場合などです。
このパターンの使用にはパフォーマンス コストがかかるため (Javascript や Typescript とは関係ありません)、絶対に必要な場合にのみ使用してください。
WeakMapのサポートがより広く利用可能になると、こちらの例 #3 で詳しく説明されている興味深い手法があります。
プライベート データを許可し、インスタンス メソッドだけでなくプロトタイプ メソッドからデータにアクセスできるようにすることで、Jason Evans の例のパフォーマンス コストを回避します。
リンクされた MDN WeakMap ページには、Chrome 36、Firefox 6.0、IE 11、Opera 23、および Safari 7.1 でのブラウザー サポートがリストされています。
let _counter = new WeakMap();
let _action = new WeakMap();
class Countdown {
constructor(counter, action) {
_counter.set(this, counter);
_action.set(this, action);
}
decrement() {
let counter = _counter.get(this);
if (counter < 1) return;
counter--;
_counter.set(this, counter);
if (counter === 0) {
_action.get(this)();
}
}
}