【问题标题】:Set method to be defined after instantiation of object设置对象实例化后定义的方法
【发布时间】:2015-01-28 18:02:42
【问题描述】:

如何定义一个对象的方法,该方法可以在对象实例化后设置,但在事件发生时从对象内部代码调用?

例如,我有一个这样的构造函数:

function ExampleObject(){
    if(!(this instanceof ExampleObject)){
        throw "Error not called using the new keyword";
    }
    this.functionToCall; //set a function that can be defined later
    function init(){
        var xhr = new XMLHttpRequest();
        xhr.open("get", location, true);
        xhr.onreadystatechange = function(){
            if(typeof this.functionToCall !== "undefined"){//problem with use of "this" here?
                //...execute code...
            }
        };
        xhr.send();
     }
     init();
}

然后,我创建这个对象的一个​​实例并设置函数:

var example = new ExampleObject();
example.functionToCall = function(){/*some code*/};

但是,它永远不会到达 if 语句中的代码,以查看函数是否已定义 (if(typeof this.functionToCall !== "undefined"))。因此,看来我的方法可能不是正确的方法。是否有另一种方法来实现这一目标?如果是这样,为什么我的方法行不通?

【问题讨论】:

  • 您在构造函数中进行typeof 测试,而不是在事件发生时。您需要将其放入由事件触发的另一个函数中。
  • 请详细说明。为什么 typeof 测试是在构造函数中还是在另一个函数中?如果我使用this 关键字,它应该访问相同的对象属性。
  • 老实说,这只是一个例子。我的真实代码确实在另一个函数中有条件。我使用注释行//... event has occurred 试图说明这一点。
  • @AndroidStudent:是的,但在不同的时间:在您分配实际功能之前与之后。
  • 也许你应该简单地将动态函数传递作为参数给构造函数;而不是之后修改实例。

标签: javascript oop scope


【解决方案1】:

所以,我的方法没问题。我的问题与范围有关。首先,正如 cmets 中所指出的,您调用条件 (if(typeof this.onmessage !== "undefined")) 的位置确实很重要。如果它在构造函数中被调用,那么this.onmessage 还没有被定义。因此,它必须在事件函数中调用,这就是我的问题所在。

在我的事件函数中,我使用this 关键字调用“typeof 条件”。这里,this 指的是事件函数的对象调用(在我的例子中是“xhr”),而不是构造函数定义的对象实例(ExampleObject)。为了解决这个问题,我只是在构造函数中放置了一个变量,该变量引用了this 的实例:

var that = this;

然后,我可以在不同范围的内部函数中使用这个变量来引用 ExampleObject 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多