4

我创建了一个像这样的类:

function MyClass()
{
    var myInt = 1;
}

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

不幸的是,这this是触发事件(在我的情况下是一个<a>标签),我无法访问类属性。

有什么建议么?

4

4 回答 4

4

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

以下代码

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

不会做你想做的事。

例如,Javascript 不像 C# 那样处理委托,因此 myObject.EventHandler 不是为 myObject 调用的 EventHandler 方法。

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

element.addEventListener("click", function(event)
{
    myObject.EventHandler(event);
});
于 2009-03-30T07:07:21.570 回答
4

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

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

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

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

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

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

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

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

推荐讲座:JavaScript 中的私人会员(Douglas Crockford)

于 2009-03-30T07:14:33.160 回答
2

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

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

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

我建议您查看这些链接以获取有关以下内容的更多信息this

此外,

function MyClass()
{
    var myInt = 1;
}

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

于 2009-03-30T07:11:32.887 回答
0

假设您替换var myIntthis.myInt,您可以MyClass.myInt从内部引用它,MyClass.prototype.EventHandler而不必担心引用this的是什么。

于 2009-03-30T12:10:41.620 回答