我正在尝试创建可以继承并具有一些公共属性的封装对象。这是一些代码:
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()log'undefined undefined'究竟是什么?我该如何解决这个问题呢?
我正在尝试将publicVar1和publicVar2保留在MyObject模块的内部范围内,但也使它们可以公开访问并由扩展myObject原型的任何其他对象继承。
感谢。
答案 0 :(得分:0)
当bar调用foo()时,它调用的函数不是任何对象的成员,该函数中的“this”关键字指的是窗口对象。
这样可行:
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