1

クラスとして機能するJavaScriptで定義された関数があります。その中にいくつかのパブリック メソッドが定義されていますが、1 つのプライベート メソッドがあり、その中のパブリック メソッドの 1 つにアクセスする必要があります。

function myClass(){ 
   this.myPublicMethod = function(a,b){
       var i = a*b;
       return i;
   }

   function myPrivateMethod(){
        var n = this.myPublicMethod(2,3);
   }
}

これはうまくいきません。myPrivateMethod 内で myPublicMethod にアクセスする方法はありますか?

4

7 に答える 7

2

thisを使用してプライベート メソッドを呼び出すときに、 の値を指定するだけですFunction.prototype.call

myPrivateMethod.call(this);

例えば

function myClass(){ 
   this.myPublicMethod = function(a,b){
       var i = a*b;
       return i;
   }

   function myPrivateMethod(){
        var n = this.myPublicMethod(2,3);
   }

   //calling private method in the *scope* of *this*.
   myPrivateMethod.call(this);
}

真のプライベート メンバー (関数ではない) を使用すると、プロトタイプを利用できないという犠牲が伴うことに注意してください。そのため、私は真のプライバシーを強制するよりも、プライベート メンバーを識別するために命名規則やドキュメントに依存することを好みます。これは、非シングルトン オブジェクトにのみ当てはまります。

次の例は、上記の内容を示しています。

//Constructors starts by an upper-case letter by convention
var MyClass = (function () {

    function MyClass(x) {
        this._x = x; //private by convention
    }

    /*We can enforce true privacy for methods since they can be shared
    among all instances. However note that you could also use the same _convention
    and put it on the prototype. Remember that private members can only be 
    tested through a public method and that it cannot be overriden.*/
    function myPrivateMethod() {
        this.myPublicMethod1();
    }

    MyClass.prototype = {
        constructor: MyClass,
        myPublicMethod1: function () {
            //do something with this._x
        },
        myPublicMethod2: function () {
            /*Call the private method by specifying the *this* value.
            If we do not, *this* will be the *global object* when it will execute.*/
            myPrivateMethod.call(this);            
        }
    };

    return MyClass;

})();
于 2013-10-08T00:13:35.943 に答える
1

これを行う 1 つの方法は、最初にすべてのメソッドをプライベートとして定義し、最後に必要なメソッドをパブリックにすることです (オーバーライドされた場合でもmyPrivateMethod元のメソッドを参照します)。myPublicMethodmyClass.myPublicMethod

function myClass(){ 
   var myPublicMethod = function(a,b){
       var i = a*b;
       return i;
   }

   var myPrivateMethod = function (){
        var n = myPublicMethod(2,3);
   }

   this.myPublicMethod = myPublicMethod;
}
于 2013-10-08T00:09:57.697 に答える
1

これを試して、ローカルスコープを無効にすることができます:

function myClass(){ 

   this.myPublicMethod = function(a,b){
       var i = a*b;
       return i;
   }
   // Capture the original context of `this` myClass
   var self = this;
   function myPrivateMethod(){
        var n = self.myPublicMethod(2,3);
   }
}

selfコンテキストが変化しても、オリジナルへの参照を維持するために使用しthisます (プライベート メソッドの中でパブリック メソッドを呼び出したいため)。

于 2013-10-08T00:06:58.147 に答える
0

あなたは書くことができます

var myPublicMethod = this.myPublicMethod = function()...

そのため、プライベート インスタンスとパブリック インスタンスが作成されました。

ただ私にはきれいに見えます。

于 2013-10-08T00:08:46.860 に答える
0

呼び出す代わりに、メソッドをFunction オブジェクトcallに直接アタッチすることもできます。myClass

function myClass(){ 

   myClass.myPublicMethod = function(a,b){
       var i = a*b;
       return i;
   }

   this.myPublicMethod = myClass.myPublicMethod;

   function myPrivateMethod(){
        var n = myClass.myPublicMethod(2,3);
        return n;
   }

   console.log("Calling myPrivateMethod()");
   console.log(myPrivateMethod());

}
于 2013-10-08T01:15:15.440 に答える