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); 
    } 
} 

我々はプロトタイプオブジェクトを使用するための複数の理由がありますが、最も説得力はプロトタイプチェーンを使用する方法の簡単な継承とオーバーライドを可能にすることはおそらくです。あるプラットフォーム上に複数の製品があり、特定の機能をオーバーライドしながら多くのJavaScriptを再利用することができます。

私の質問は、プライベートにする必要のある変数に公的にアクセスできるようにすることなく、プロトタイプチェーンのメリットをどのように得ることができるのでしょうか?

答えて

1

簡単に言えば、ECMAscript Edition 3では、プロトタイプの継承やプロトタイプチェーンを使用して「プライベート」変数を作成することはできません。

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

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

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:良い部分"です。

+0

ありがとうございました。私はその本を読んで、それが非常に有用であることを発見しましたが、私は、継承と情報隠蔽の両方を許可するという私の問題に対する解決策を見出しませんでした。あなたが何か具体的なことを挙げることができれば、それは非常に高く評価されるでしょう。 – Samo

+0

@Samo:私が正しく覚えていれば、Crockfordはメソッド的なパターンのオブジェクトインスタンス間の '共有データ 'の良い例を挙げています。 – jAndy

+0

@Samo:しかし、私はかなり基本的な例を追加しました。 – jAndy

関連する問題