我现在正在测试一个简单的Javascript“类”。我注意到我的私有函数中的“this”并没有指向对象本身,而是指向全局范围(窗口)。
为什么?
信息:我想保持模式私有,所以我使用var模式而不是this.mode。 我还希望将两个内部函数保持为私有,因此用户无权访问它。 我基本上使用.prototype来向myStorage添加公共函数来访问私有成员。
我的代码:
var myStorage = function(mymode) {
var mode = mymode;
function privateFunctionA() {
// access this.mode to read mymode from constructor but
// this is pointing to window
};
function privateFunctionB() {
// access this.mode to read mymode from constructor but
// this is pointing to window
};
// check for indexeddb, websql and localstorage
if(mymode == 'A') {
privateFunctionA();
} else {
privateFunctionB();
}
};
myStorage.prototype.publicFunc = function() {
console.log(this.mode); // does this work?
}
var data = new myStorage();
答案 0 :(得分:6)
this
始终是JavaScript中的函数作用域(除非您使用call()
或apply()
明确传入上下文。因此,在您的私有函数中,this
不再引用与父作用域中的this
相同。在JavaScript中处理此问题的惯用方法是将this
分配给父作用域中的self
var。例如,
var myStorage = function(mymode) {
var self = this;
var mode = mymode;
function privateFunctionA() {
console.log(self);
};
...
};
关于此代码段:
myStorage.prototype.publicFunc = function() {
console.log(this.mode); // does this work?
}
您需要在构造函数中将mode
分配给this
(而不是var
)。因此,构造函数现在变为:
var myStorage = function(mymode) {
var self = this;
this.mode = mymode;
function privateFunctionA() {
// works
console.log(self.mode);
};
...
};
在这种情况下,this.mode
也适用于.publicFunc()
。
作为一个更具风格的说明,JavaScript中的构造函数通常使用正确的驼峰大小写(即MyStorage
)。
答案 1 :(得分:0)
我不认为你在使用原型时可以使用它来访问对象本身,因为范围发生了变化而你放松了对主要对象本身的引用,所以这就变成了窗口。
检查其他问题以获取更多信息:
Use of 'prototype' vs. 'this' in JavaScript?
希望这有帮助。