-1

スコープチェーンは最初の「test = new test();」になると思いました。動作しますが、動作しません。なぜ?

var tool = new Tool();
tool.init();

function Tool(){
    var test;

    function init(){
        //does not work, undefined
        test = new Test();

        //does work
        this.test=new Test();

        console.log(test);
    }
}

function Test(){
}

編集:つまり、動作しないということは、テストが「未定義」であると言います

4

2 に答える 2

2

それは簡単です。インスタンスにメソッドがありませToolinit。コード内のinit関数は、コンストラクターの単なるローカル関数ですToolToolインスタンスはそのような機能を継承しません。

Toolインスタンスにメソッドを持たせたい場合は、次のinitことができます。

  1. コンストラクター内のメソッドとして割り当てます。

    function Tool () {
        this.init = function () { ... };
    }
    
  2. Tool.prototypeまたはそれを(コンストラクタの外で!)に割り当てます:

    Tool.prototype.init = function () { ... };
    

2 番目のオプションは、すべてのインスタンスが同じinit機能を共有するため、パフォーマンスが向上します。init(最初のオプションでは、各インスタンスは、コンストラクターの呼び出し中に作成される独自の関数を取得します。)

于 2012-11-09T19:02:34.160 に答える
1

testTool のスコープ内でアクセスしようとしていますか、それともそれによって返されたオブジェクトにアクセスしようとしていますか? これらは 2 つの異なる変数です。私はそれらにAとBのラベルを付けました:

var tool = new Tool();

function Tool(){
    var testA; // Private

    this.init = function(){
        testA = 1;

        this.testB = 9; // Public
    }

    this.getTestA = function(){ // Public method to access the private testA
        return testA;
    }

}

tool.init();

console.log( tool.getTestA() ); // 1
console.log( tool.testB ); // 9

testAプライベート変数として知られ、ツールのメソッドを介してのみアクセスできますtestBが、パブリックです。

これはあなたが探しているものをカバーしていますか?

ところで、Tool のインスタンスを多数作成している場合は、代わりに Tool のプロトタイプを使用して関数を定義することを忘れないでください。これにより、次のように、コードのメモリ効率が向上します。

function Tool(){
    var testA;
}
Tool.prototype.init = function(){
    testA = 1;
    this.testB = 9;
}
Tool.prototype.getTestA = function(){  return testA; }
于 2012-11-09T19:07:08.187 に答える