114

TypeScript でのプライベート メンバーの実装を検討していますが、少し混乱しています。Intellisense はプライベート メンバーへのアクセスを許可しませんが、純粋な JavaScript では、すべてそこにあります。これは、TS がプライベート メンバーを正しく実装していないと思わせます。何かご意見は?

class Test{
  private member: any = "private member";
}
alert(new Test().member);
4

9 に答える 9

105

型チェックと同様に、メンバーのプライバシーはコンパイラー内でのみ適用されます。

プライベートプロパティは通常のプロパティとして実装され、クラス外のコードはそれにアクセスできません。

クラス内で真にプライベートなものを作成するには、クラスのメンバーにすることはできません。オブジェクトを作成するコード内の関数スコープ内で作成されたローカル変数になります。thisつまり、クラスのメンバーのように、つまりキーワードを使用してアクセスすることはできません。

于 2012-10-03T17:36:58.397 に答える
38

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 とは関係ありません)、絶対に必要な場合にのみ使用してください。

于 2014-06-06T16:01:00.610 に答える
11

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)();
    }
  }
}
于 2016-04-10T04:23:32.557 に答える