我刚刚编写了这段代码,并在警报部分收到错误告诉我,这个字词没有被定义。 我猜jquery部分会更改“this”值,因为在注释的位置,我可以访问数组。
现在我卡住了,因为我不想让属性全局化(使它运行的原因)。 所以我想问你一个解决问题的方法,同时保持“OOP”风格。
function game()
{
this.difficulty = 0;
this.mode = 0;
this.words = new Array();
this.loadWords = function()
{
//request word pool
$.ajax({
type:"GET",
url:"word.php",
data:{mode:this.mode, difficulty:this.difficulty}
}).done(function(html) {
alert(this.words.length);
});
}
}
答案 0 :(得分:3)
这似乎是一个范围问题。 this
不再引用.done
函数中的游戏对象。尝试
this.loadWords = function()
{
var that = this;
//request word pool
$.ajax({
type:"GET",
url:"word.php",
data:{mode:this.mode, difficulty:this.difficulty}
}).done(function(html) {
alert(that.words.length);
});
}
答案 1 :(得分:3)
function Game()
{
this.difficulty = 0;
this.mode = 0;
this.words = new Array();
this.wordsLoaded = $.proxy(this.wordsLoaded, this);
}
var method = Game.prototype;
method.loadWords = function() {
$.ajax({
type:"GET",
url:"word.php",
data:{mode:this.mode, difficulty:this.difficulty},
success: this.wordsLoaded
});
};
method.wordsLoaded = function() {
alert( this.words.length );
};
答案 2 :(得分:2)
this
处理程序中`done()
的值已更改,因此它不再是您的对象。您可以通过将this
的副本保存到另一个变量中来解决此问题:
function game()
{
this.difficulty = 0;
this.mode = 0;
this.words = new Array();
this.loadWords = function()
{
var self = this;
//request word pool
$.ajax({
type:"GET",
url:"word.php",
data:{mode:this.mode, difficulty:this.difficulty}
}).done(function(html) {
alert(self.words.length);
});
}
}
答案 3 :(得分:1)
通过执行以下操作在内部保存游戏功能:
var _self = game;
这样你就可以_self.difficulty
,_self.words.length
等......他们就可以访问它了。
答案 4 :(得分:0)
你可以看看
http://javascript.crockford.com/private.html
有关javascript中的私有,受保护和公开的更多想法,但这是一个解决方案:
未经测试的代码
function game() {
var difficulty = 0;
var mode = 0;
var words = [];
this.loadWords = function()
{
//request word pool
$.ajax({
type:"GET",
url:"word.php",
data:{mode:this.mode, difficulty:this.difficulty}
}).done(function(html) {
alert(this.words.length);
});
}
}
你也想要words
的getter,但基本上有一种方法可以通过调用函数来初始化它,而任何其他访问都是通过getter。
未经测试的代码
function game(){ var difficulty = 0; var mode = 0; var words = []; var that = this; this.loadWords = function() { //请求单词池 $就({ 键入: “GET”, 网址:“word.php” data:{mode:that.mode,difficulty:that.difficulty} 完成(function(html){ 警报(this.words.length); }); } }
我添加了一个that
变量并将其设置为this
,以帮助封闭该值,但在ajax调用中,直接调用mode
变量就足够了,但它可能需要使用that
。此外,函数之前的this
可能是一个问题,不确定,我需要使用调试器来查看实际发生的情况并查看实际使用的内容。
我错过了.ajax调用中的this
,这是最初的问题。