Я пытаюсь создать инкапсулированные объекты, которые можно унаследовать и которые обладают некоторыми общедоступными свойствами. Вот код:Шаблон модуля и область действия
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.
Спасибо.
Это, безусловно, решить проблему, спасибо. Я все еще не понимаю, почему. Можете ли вы подробно остановиться? Когда я вызываю this.foo() Я вызываю функцию на прототипе и потому что publicVar1 и publicVar2 являются членами объекта этого прототипа, они находятся в правильной области? Еще раз спасибо. – adampetrie
@adampetrie прототип наследуется каждым экземпляром и обрабатывается так, как если бы он был частью экземпляра (за исключением того, что он затеняется, а не перезаписывается, если вы задаете вещи в экземпляре). 'mo.foo()' делает 'делает 'mo'' '' foo'? no. does 'mo.prototype' имеет' foo'? yes. Вызывать 'foo'' mo.prototype' в контексте 'mo '«. Поэтому во время этого вызова внутри 'foo'' this' означает 'mo', поэтому' this.bar() 'похоже на' mo.bar() '. –