-1

JavaScriptで継承とスコープアクセスを学んでいます。そこで、以下のサンプルプログラムを作成しました。

var A = function(){

    var privateVariable = 'secretData';

        function E(){
        console.log("Private E");
        console.log("E reads privateVariable as : " + privateVariable);
        };

        B  =  function(){
           console.log("GLOBAL B");
           console.log("B reads privateVariable as : " + privateVariable);
        } ;

        this.C = function(){
           console.log("Privilaged C");
           console.log("C reads privateVariable as : " + privateVariable);
       };

};

A.prototype.D = function(){
    console.log("Public D, I can call B");    
    B();    
};

A.F = function(){
    console.log("Static D , Even I can call B");
    B();    
};

var Scope = function(){

        var a = new A();

        Scope.inherits(A); // Scope inherits A

        E(); // private Method of A , Error : undefined.  (Acceptable because E is private)
        this.C(); // private Method of A, Error : undefined. 
        D(); // public Method of A, Error : undefined.

}

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

Function.method('inherits', function (parent) {
    console.log("I have been called to implement inheritance");
    //Post will become lengthy. Hence,
    //Please refer [crockford code here][1]
});

私の疑問は次のとおりです。

  1. B のような宣言されていない変数はグローバル スコープになります。B を介して privateVariable にアクセスすることはプログラミングのスタイルが悪いかどうか? (なぜなら、privateVariable はそのようにアクセスできないからです。) もしそうなら、なぜ javascript がそのような定義とアクセスを許可するのか。

  2. CとDを継承したいのですがうまくいきませんか?どこで間違ったのですか?

  3. 楽しみのために、crockford のページにあるように古典的な継承を試してみましたが、専門家は製品コードで古典的な継承を使用するでしょうか? そうすることが賢明かどうか、(結論として、クロックフォードは初期に古典的な継承を実装しようとしたことを後悔しているため)

4

1 に答える 1

1

最初の質問について: これは厳密モードではできなくなりました。

2 番目の質問: Scope.inherits(A)のすべてのプロパティAScopeではなく に追加しますthis。そのthis.C時点では存在しません。の新しいインスタンスを作成するScope.inherits(A) に呼び出す必要がありますScope

D()という名前の関数を呼び出しますD。しかし、そのような機能はありません。あなただけがありA.prototype.Dます。このメソッドを呼び出したい場合は、 で実行できますthis.D()。繰り返しますthis.D()が、当時は存在しませんでした。

3 番目の質問: それは個人的な選択です。どの言語でも、他の言語をシミュレートするのではなく、その言語を有利に使用することをお勧めします。

于 2013-04-28T06:45:11.853 に答える