2013-06-14 4 views
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() лог «не определено не определено», и как я могу решить эту проблему?

Я пытаюсь сохранить publicVar1 и publicVar2 в объеме внутри модуля MyObject, но также сделать их общедоступными и унаследованными любыми другими объектами, которые расширяют прототип myObject.

Спасибо.

ответ

0

Когда бар вызывает foo(), он вызывает функцию, которая не является членом какого-либо объекта, а ключевое слово «this» внутри этой функции относится к объекту окна.

Это будет работать:

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

EDIT

Ваш код может быть весьма непросто понять для кого-то пытается понять сферу. Имейте в виду, что когда вы вызываете mo.foo() и mo.bar() и this.foo() (внутри функции бара), вы ссылаетесь на свойства, которые вы указали на прототипе, а не на имена функций вы заявили в своем модуле. Это просто совпадение, что у них одно и то же имя.

Ниже код будет иллюстрировать это немного лучше:

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 
+0

Это, безусловно, решить проблему, спасибо. Я все еще не понимаю, почему. Можете ли вы подробно остановиться? Когда я вызываю this.foo() Я вызываю функцию на прототипе и потому что publicVar1 и publicVar2 являются членами объекта этого прототипа, они находятся в правильной области? Еще раз спасибо. – adampetrie

+0

@adampetrie прототип наследуется каждым экземпляром и обрабатывается так, как если бы он был частью экземпляра (за исключением того, что он затеняется, а не перезаписывается, если вы задаете вещи в экземпляре). 'mo.foo()' делает 'делает 'mo'' '' foo'? no. does 'mo.prototype' имеет' foo'? yes. Вызывать 'foo'' mo.prototype' в контексте 'mo '«. Поэтому во время этого вызова внутри 'foo'' this' означает 'mo', поэтому' this.bar() 'похоже на' mo.bar() '. –

Смежные вопросы