27

Douglas Crockford http://javascript.crockford.com/private.htmlによると、私の理解が正しければ、「特権」メソッドは「パブリック」メソッドとして知られているものに似ています。「パブリック」メソッドは少し異なります。

これが私がそれを理解する方法です:

  1. 「特権」メソッドは、残りのプライベート変数が定義されたときにクロージャー内で定義されるため、プライベート変数にアクセスできます。

    var C = function(){
      var private;
      this.privilegedMethod = function(){
           /* blah blah */
      };
    }
    var cObj = new C();
    
  2. 「パブリック」メソッドは、プロトタイプを通じて、オブジェクト自体の外部にあるオブジェクトに追加されるメソッドです。

    var C = function(){
       /* blah blah */
    }
    C.prototype.publicMethod = function(){
        /* blah blah */
    };
    var cObj = new C();
    

これらの「特権」と「公」の定義は非常に紛らわしいと思います。オブジェクト指向プログラミングからわかるように、「特権」メソッドは実際にはパブリックメソッドにすぎないと思います。そして、「パブリック」メソッドは別のものとして名前を付ける必要があると思います。考えてみると、これは奇妙なタイプの関数であり、オブジェクトのメンバーですが、他のプライベート変数にはアクセスできません。つまり、カプセル化には寄与しません。これは、オブジェクトの独立したヘルパー メソッドのようなものです。

だから私は疑問に思っていました.なぜダグラス・クロックフォードはこれらの紛らわしい用語を思いついたのですか? また、なぜ JavaScript コミュニティはこれらの用語を採用したのでしょうか? または、何か間違っている場合は、修正してください。

4

5 に答える 5

10

JavaScript には public/private/protected のようなスコープ修飾子がないため、OOP の世界に近づくために、Douglas Crockford はそのような名前を使用して、Java の出身者を混乱させないようにしています。

特権メソッドは、関数内で定義された変数を参照できるため (重要な注意 - JavaScript では、唯一のスコープは関数スコープです。ブロック スコープはありません)、それらは「特権」されます。はい、オブジェクトインスタンスから呼び出すことができますが、ここで重要なことは、var(本当のプライベートなもの)で宣言されたすべてのものを見ることです。

一方、オブジェクトのプロトタイプにアタッチされているパブリック メソッドには、もう 1 つ重要なことがあります。それらは一度評価され、指定されたオブジェクトのすべてのインスタンスに対して表示されます。

プロトタイプ メソッド内でキーワードを使用するthisと、オブジェクトの現在のインスタンスを指しますが、 内で定義されているものしか見ることができませんthis

明確になるかどうかはわかりませんが、ここで重要なことは、JavaScript はプロトタイプ ベースの言語であり、継承を可能にするために言語にプロトタイプ チェーンが導入されたことです。

于 2012-09-15T17:40:11.537 に答える
3

Vlad、私はあなたに同意します:私も混乱しています!ここを見てください(http://javascript.crockford.com/private.htmlから):

function Container(param) {
    // methode privee
    function dec() {
    console.log('private method is looking for private member secret : ' + secret);
        if (secret > 0) {
            secret -= 1;
            return true;
        } else {
            return false;
        }
    }
    // membres privées
    var secret = 3;
    var that = this;
    // méthode privilégiée
    this.service = function () {
    console.log('priviligied method is looking for private member secret : ' + secret);
        return dec() ? that.member : null;
    };
    // membres publiques
    this.member = param;

}
var myContainer = new Container('abc');

Container.prototype.stamp = function (string) {
    console.log('public method is looking for private member secret : ' + this.secret);
    return this.member + string;
}

console.log(myContainer.stamp('def'));
//for (i=0;i<4;i++)
console.log(myContainer.service());

特権 vs 公開

この jsfiddle サンプルは次のように表示されます。

public method is looking for private member secret : undefined
abcdef
priviligied method is looking for private member secret : 3
private method is looking for private member secret : 3
abc

答えは、パブリック メソッド <=> 特権メソッドではないでしょうか。

于 2013-02-05T17:39:37.070 に答える
1

従来の OOP 言語では、クラスのすべてのメンバーがクラスの他のすべてのメンバーにアクセスできます。

これは Javascript には当てはまりません。パブリック メソッドは、クラスの他のメンバー (つまり、コンストラクター関数) が知らないプライベート データにアクセスできます。同様に、クラスの他のメンバーは、メソッドが認識できないデータを持っている可能性があります。

以下を検討してください。

function TheirTrait() {
  var privateData = "foo";
  this.privilegedMethod = function() {
    return privateData;
  }
}

function MyClass() {
  var privateData = undefined;
  this.publicMethod = function() {
    return privateData;
  }
  TheirTrait.apply(this, arguments);
}

var myObject = new MyClass();
myObject.privilegedMethod() // returns "foo"
myObject.publicMethod() // returns undefined

ご覧のとおり、publicMethodprivilegedMethodは両方とも外部からアクセスできるという意味で公開privilegedMethodされていますが、追加のデータにアクセスできます。

于 2015-08-05T11:27:39.657 に答える
0

両方の種類のメソッドの主な違いは、特権メソッドは継承できるということです。これは、子クラスがそれらに直接アクセスできることを意味しますが、もちろん従来の継承アプローチでは、子クラスではパブリック メソッドを使用できません。

これが役に立つことを願っています。

于 2014-12-31T17:35:38.183 に答える