0

継承可能で、いくつかのパブリック プロパティを持つカプセル化されたオブジェクトを作成しようとしています。ここにいくつかのコードがあります:

var MyObject = (function()
{
    function myObject()
    {
        //Public variables
        this.publicVar1 = 'hello';
        this.publicVar2 = 'world';
    }

    function foo()
    {
        console.log(this.publicVar1 + ' ' + this.publicVar2);
    }

    function bar()
    {
        foo();
    }

    //Public API
    myObject.prototype = {
        constructor: myObject,
        foo: foo,
        bar: bar
    }

    return myObject;

})();

var mo = new MyObject();
mo.foo(); //hello world
mo.bar(); //undefined undefined

私の質問はなぜ mo.bar() が 'undefined undefined' をログに記録するのですか? また、この問題を修正するにはどうすればよいですか?

publicVar1 と publicVar2 を MyObject モジュールの内部のスコープに保持しようとしていますが、myObject プロトタイプを拡張する他のオブジェクトによってパブリックにアクセス可能で継承されるようにもしています。

ありがとう。

4

1 に答える 1

0

bar が foo() を呼び出すとき、それはどのオブジェクトのメンバーでもない関数を呼び出しており、その関数内の「this」キーワードは window オブジェクトを参照しています。

これはうまくいきます:

function bar()
{
    this.foo();
}

編集

スコープを理解しようとしている人にとって、コードは非常に誤解されやすいものです。mo.foo() と mo.bar() と this.foo() (bar 関数内で) を呼び出すときは、関数の名前ではなく、プロトタイプで宣言したプロパティを参照していることに注意してください。モジュール内で宣言しました。たまたま同じ名前なのは偶然です。

以下のコードは、それをもう少しよく示しています。

var MyObject = (function()
{
    function myObject()
    {
        //Public variables
        this.publicVar1 = 'hello';
        this.publicVar2 = 'world';
    }

    function moduleFooFunction()
    {
        console.log(this.publicVar1 + ' ' + this.publicVar2);
    }

    function moduleBarFunction()
    {
        this.foo();
    }

    //Public API
    myObject.prototype = {
        constructor: myObject,
        foo: moduleFooFunction,
        bar: moduleBarFunction
    }

    return myObject;

})();

var mo = new MyObject();
mo.foo(); //hello world
mo.bar(); //undefined undefined
于 2013-06-14T00:38:53.883 に答える