0

パブリック セッター/ゲッター関数を持つプライベート変数を持つクラスがあります。

function Circle(rad) {
    var r = rad;

    this.radius = function(rad) {
        if(!arguments.length) return r;
        r = rad;
        return this;
    }
}

var shape = new Circle(10);
console.log( shape.radius() ); // 10
shape.r = 50;
console.log( shape.radius() ); // 10

を使用してこれを複製するにはどうすればよいObject.prototypeですか? または、代わりにクロージャーを使用したいのはObject.prototypeいつですか?これは私が思いついた最も近いものですが、ご覧のとおり、プロパティを直接変更できます。

function Circle(r) {
    this.r = r;
}

Circle.prototype.radius = function(r) {
    if(!arguments.length) return this.r;
    this.r = r;
    return this;
};

var shape = new Circle(10);
console.log( shape.radius() ); // 10
shape.r = 50;
console.log( shape.radius() ); // 50
4

2 に答える 2

4

プロトタイプを使用してオブジェクトのプロパティを格納する場合は、オブジェクトへの参照を持つ任意のコードからアクセスできます。あなたがしたいことをすることは不可能です。

多くの JS 開発者が行っていることは、プライベート プロパティの名前の先頭にアンダースコアを付けて、他の人がそれを台無しにしないようにすることですが、それは提案を超えた実際の保護を提供しません。

閉鎖ベースのアプローチを使用する理由

  • 真のプライベート変数。誰もあなたのプライベートをいじらないと確信してください

プロトタイプを使用する理由

  • 使用されるメモリが少ない (すべてのインスタンスのクロージャがない)
  • デバッグが容易 (プロパティはオブジェクト自体に表示されます)
  • モンキーパッチを許可

読者の皆様: 最善の解決策と思われる理由を含めて、回答を編集してください。

于 2012-06-14T21:48:08.610 に答える
0

あなたの最初のサークルはとても奇妙だと思います。書き直すと次のようになります。

        function Circle(rad) {
            var r = rad;

            this.radius = function(rad) {
                if(rad){r = rad;}
                return r;
            }
        }

私はそれが今あなたが意味することをしていると思います。r はプライベートで、radius はゲッター/セッター関数として機能します。r を次のように設定します。

shape.r = 50;

最初の Circle にはプロパティ r がなく、ローカルにスコープされた変数 r しかないため、意味がありません。何らかのエラーが発生するはずです。

プロトタイプ チェーンの関数は、Circle オブジェクトで作成された変数にアクセスできないため、Circle の 2 番目のバージョンでプロトタイプを使用する方法がわかりません。とにかく、あなたの 2 番目のバージョンでは、r は Circle のプロパティであり、関数本体のプライベート スコープの変数ではありません。

于 2012-06-14T22:02:16.180 に答える