1

マークされた行が見つからないのはなぜprotectedACMemberですか?

var Module = (function (ns) {

    function AbstractClass() {
        this.protectedACMember = "abstract";

        this.abstractPublicACMethod = function (input) {
            this.methodToImplement();                   
        }
    }

    ConcreteClass.prototype = new AbstractClass();
    function ConcreteClass(){
        var privateCCMember = "private CC";

        var privateCCMethod = function(){
            alert(this.protectedACMember); // cant find protectedACMember
        }

        this.methodToImplement = function(){ 
            privateCCMethod();
            console.log('Implemented method '); 
        }

    }

    ns.ConcreteClass = ConcreteClass;   

    return ns;

})(Module || {});

//somewhere later
var cc = new Module.ConcreteClass();
cc.abstractPublicACMethod();

プライベート、保護、およびパブリック メンバーをシミュレートするための適切なパターンはありますか? 静的/非静的も?

4

3 に答える 3

1

コードのその部分を次のように変更する必要があります。

    var self = this;
    var privateCCMethod = function(){
        alert(self.protectedACMember); // this -> self
    }

このようにして、クロージャーで参照を取得します。

その理由は、「this」は予約語であり、その値はインタープリターによって設定されるためです。privateCCMethod はオブジェクト プロパティではなく匿名関数であるため、単純に privateCCMethod() 構文で呼び出すと、これは null になります。「this」を特定のものにバインドしたい場合は、次のように .call 構文をいつでも使用できます。

privateCCMethod.call(this)
于 2013-01-29T13:53:51.123 に答える
0

関数に入るとキーワードの意味が変わるprotectedACMemberため、検索に失敗します。一般的な方法は、関数内で使用するためにアウターを格納することです。thisprivateCCMethodthis

function ConcreteClass(){
    var privateCCMember = "private CC";

    // store the outer this
    var that = this;
    var privateCCMethod = function(){
        alert(that.protectedACMember);
    }
    ...

残りの質問はかなりロードされており、おそらく別の質問として投稿する必要があります.

于 2013-01-29T13:49:47.897 に答える
0

それを確実にする別の方法thisは、 を使用することですbind。Bind を使用すると、関数が の特定の値で呼び出されるようにすることができますthis

ほとんどの新しいブラウザーは (IE9 も!) サポートしており、サポートしていないブラウザーには回避策があります。

バインド - MDN ドキュメント

于 2013-01-29T13:59:38.983 に答える