类方法无法访问属性

时间:2009-03-30 06:57:52

标签: javascript class javascript-events

我创建了一个类似的类:

function MyClass()
{
    var myInt = 1;
}

MyClass.prototype.EventHandler = function(e)
{
    alert(this.myInt);
}

不幸的是,this是触发事件(在我的casss标签中),我无法访问类属性。

有什么建议吗?

4 个答案:

答案 0 :(得分:4)

这取决于您在注册活动时如何提供事件处理程序。

以下代码

element.addEventListener("click", myObject.EventHandler);

不会做你想做的事。

Javascript不会像C#那样处理委托,所以myObject.EventHandler不是为myObject调用的EventHandler方法。

如果要将对象上的方法作为事件处理程序调用,最好将其包装到函数中。

element.addEventListener("click", function(event)
{
    myObject.EventHandler(event);
});

答案 1 :(得分:4)

构造函数中声明的“vars”在其他公共函数中不可用,它们被视为“私有成员”。

您可以使用this.myInt = 1将该成员公开,并且可用于所有类方法:

function MyClass(){
    this.myInt = 1;  // Public member
}

MyClass.prototype.EventHandler = function(e){
    alert(this.myInt);
}

或者您可以使用“特权”方法来访问构造函数范围内的“ private ”成员:

function MyClass(){
    var myInt = 1; // Private member

    this.getMyInt = function(){  // Public getter
        return myInt;
    }
}

MyClass.prototype.EventHandler = function(e){
    alert(this.getMyInt());
}

推荐讲座:Private Members in JavaScript(Douglas Crockford)

答案 2 :(得分:2)

JavaScript实际上没有类。 MyClass是对象的构造函数,其原型是对象MyClass.prototype

this关键字可能会让人难以理解;它在函数中的值取决于函数被称为函数的对象。

如果你想能够从事件处理程序中调用对象的方法,你应该使用像Vincent Robert建议的函数闭包。

我建议您查看这些链接,了解有关this的更多信息:

此外,

function MyClass()
{
    var myInt = 1;
}

此构造函数在函数内设置一个局部变量,该变量无法从函数外部访问。如果要初始化对象的属性,则需要使用this.myInt = 1。该值仅在new MyClass()构造的对象上设置,而不是在MyClass函数对象本身上设置。

答案 3 :(得分:0)

假设您将var myInt替换为this.myInt,您可以在MyClass.myInt内将其引用为MyClass.prototype.EventHandler,而无需担心this引用的内容。