如何在包含函数的方法中使用类变量?

时间:2014-12-18 18:28:19

标签: javascript oop

所以我想说我有这段代码:

MyClass = {

    classVar1: 'Teddy Bear',
    classVar2: 'Boogy Man',

    firstMethod: function() {
        console.log('I love my' + this.classVar1); // works

        setTimeout(function() {
            console.log('But I hate the ' + this.classVar2); // does not work
        }, 2000);

        someElement.addEventListener('click', function() {
            console.log('I also hate the ' + this.classVar2); // also does not work
        });

    }

};

MyClass.firstMethod();

因为firstMethod内部存在嵌套函数,所以无法访问第二个类变量。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

您可以使用bind强制this值正确无误:

setTimeout((function() {
    console.log('But I hate the ' + this.classVar2);
}).bind(this), 2000);

或者,您可以捕获变量中的原始this值:

var that = this;
setTimeout(function() {
    console.log('But I hate the ' + that.classVar2);
}, 2000);

答案 1 :(得分:1)

您可以存储对父this的引用;

firstMethod: function() {
    var _this = this;
    console.log('I love my' + this.classVar1);

    setTimeout(function() {
        console.log('But I hate the ' + _this.classVar2); 
    }, 2000);

    someElement.addEventListener('click', function() {
        console.log('I also hate the ' + _this.classVar2);
    });
}

答案 2 :(得分:1)

你在这里创建的是一个javascript对象,而不是一个类。为了创建一个类,你需要做这样的事情:

var MyClass = function() {

    var self = this; // Create a local variable that stores a pointer to 'this'

    this.classVar1 = 'Teddy Bear';
    this.classVar2 = 'Boogy Man';

    this.firstMethod = function() {
        console.log('I love my' + self.classVar1); // use self instead of this

        setTimeout(function() {
            console.log('But I hate the ' + self.classVar2); // use self instead of this
        }, 2000);

        someElement.addEventListener('click', function() {
            console.log('I also hate the ' + self.classVar2); // use self instead of this
        });
    }
};

然后使用上面的类创建一个这样的对象:

var myObject = new MyClass();
myObject.firstMethod();

希望这有帮助。

答案 3 :(得分:0)

要在您自己的班级中引用您的变量,您只需

Class={
     classvar:'x'
     function myfunction(){
           return this.classvar;
     }
 }
 Class.myfunction(); // should return x

应该足够this.variable来访问类或对象中的方法中的全局变量