1

パブリックメソッドのパラメーターによって設定されるプライベートインスタンス変数をクラスに設定する方法を理解しようとしています。ただし、この場合、somePublicMethodの外部ではmyPrivateVarが未定義になるようです。私がやろうとしていることをどのように達成できますか?

MyClass = function() {
    var myPrivateVar;

    this.somePublicMethod(myPrivateVar) {
        myPrivateVar = myPrivateVar //????
    }

    this.someOtherPublicMethod() {
        somePrivateMethod();
    }

    function somePrivateMethod() {
        myPrivateVar++;
    }
}
4

3 に答える 3

2

問題はvar myPrivateVar、引数に同じ名前を付けることでシャドウイングしているため、引数変数のみがスコープ内にあることです。

this.somePublicMethod = function(myPrivateVar) {
    myPrivateVar = myPrivateVar; // sets the argument to itself
}

シャドウイングを回避するために、そのうちの1つに別の名前を付ける必要があります。

this.somePublicMethod = function(inputVar) {
    myPrivateVar = inputVar;
};

それ以外の場合は、何らかの方法でそれらの1つを含める必要があります。

MyClass = function () {
    var locals = {
        myPrivateVar: null
    };

    this.somePublicMethod = function (myPrivateVar) {
        locals.myPrivateVar = myPrivateVar;
    };

    function somePrivateMethod() {
        locals.myPrivateVar++;
    }
};
于 2012-09-24T01:36:26.800 に答える
1

使用this.myPrivateVar

this.somePublicMethod = function(myPrivateVar) {
    this.myPrivateVar = myPrivateVar;
}

のコンテキスト内でプライベートメソッドを呼び出すにはthis、次を使用できます。

this.somePublicMethod = function(myPrivateVar) {
    this.myPrivateVar = myPrivateVar;
    somePrivateMethod.call(this); // pass this as the context of the private method
}

function somePrivateMethod() {
    this.myPrivateVar++;
}
于 2012-09-24T01:26:04.060 に答える
0

少し違うルートを取ることを検討しましたか?

var MyClass = function(){
    var bar = "private";
    return {
        setBar: function( newBar ) { bar = newBar; },
        getBar: function() { return bar; }
    }
};

このクラスのインスタンスを新規作成すると、barプロパティはプライベートになります。setBarただし、パブリックおよびgetBarメソッドからは引き続きアクセスできます。

var inst = new MyClass;

console.log( inst.bar ); // undefined
console.log( inst.getBar() ); // 'private'

inst.setBar( 'accessible' );

console.log( inst.getBar() ); // 'accessible'
于 2012-09-24T02:23:33.223 に答える