1

私たちのコードベースでは、多くの開発者がメンバー変数の最初の文字としてアンダースコアを使用して、一般の使用を思いとどまらせていることがわかりました。通常は、オブジェクトのメソッドにアクセスできるローカル変数を宣言することをお勧めしますが、この場合、すべてのメソッドがプロトタイプで定義されているため、これは不可能と思われます。これが例です。

MyContrivedWidget = function(container) {
  this._container = jQuery(container);
}

MyContrivedWidget.prototype = {
  draw: function() {
    var link = jQuery(document.createElement('a'))
      .html('some contrived text')
      .attr('href', '#')
      .appendTo(this._container);
  }
}

プロトタイプオブジェクトを使用する理由は複数ありますが、最も説得力のあるのは、プロトタイプチェーンを使用すると、メソッドの継承とオーバーライドが容易になることです。1つのプラットフォームに複数の製品があり、特定の機能をオーバーライドしながら多くのJavaScriptを再利用したい場合があるため、これは私たちにとって良いことです。

だから私の質問は、プライベートでなければならない変数をパブリックにアクセスできるようにすることなく、プロトタイプチェーンのすべての利点をどのように得ることができるかということです。

4

1 に答える 1

1

簡単に言えば、ECMAscriptエディション3には、プロトタイプの継承またはプロトタイプチェーンを使用して「プライベート」変数を作成する可能性はありません。

ES5では少し異なります。オブジェクト内のプロパティを「隠す」ことができる.defineProperties()ヘルプのようなメソッドがあります。

ただし、たとえばプロパティを列挙から非表示にしても、それらが利用可能であることがわかっている場合は、それらにアクセスできます。あなたが言ったように、ECMAlandの唯一の本当のプライバシーはクロージャを呼び出すことです。さらに良いことに、プロパティとしてメソッドを含むオブジェクトを返すfunction(-context)を呼び出すことにより、method-patternを使用します。これらのメソッドは、(コンテキストが親コンテキストを閉じるため)外部(親)スコープで宣言された変数にアクセスできます。その後、他のオブジェクトはこれらの変数にアクセスできません。これは次のようになります。

var Animal = function( args, priv, shared ) {
    shared = shared || { };
    shared.speed = 2;
    shared.legs = 4;
    shared.name = args.name || 'unknown'; 

    priv = priv || {
        run: function() {
            console.log(shared.name, ' is running ', shared.speed, ' meters');
            return this;
        },
        die: function() {
            console.log(shared.name, ': wwuuaarhhhck.. aahahsd sd..aahsd.....');
            return this;
        }
    };

    return priv;
};

var Dog = function( args, priv, secret ) {
    secret = secret || { };

    priv = Animal( args, priv, secret ) || { };

    priv.addSomeMethod = function() { };

    return priv;
};

var bello = Dog({name: 'Bello'});
bello.die(); // "Bello:  wwuuaarhhhck.. aahahsd sd..aahsd....."

このアイデアを拡張するいくつかの素晴らしいパターンがあり、それらは継承と共有オブジェクト+スーパーメソッドも提供します。この種のプログラミングの良いスタートは、まだDouglas Crockfordsの「Javascript:良い部分」です。

于 2011-06-21T15:56:22.610 に答える