javascript - 我是否适本地使用了 Javascript 回调(面向对象的风格)?

标签 javascript callback oop

我有以下代码示例来使用从回调接收操作的对象。这似乎不是一个好的设计模式。或者是吗?

setTimeOut() 在 1 秒后触发函数时,它使用 objInstance 全局变量(DOM 范围)访问 ClassExample 对象实例。有人可以推荐一种在面向对象设计中使用回调的更好方法吗?

整个想法是我可以使用回调来更新我的对象实例中的数据(例如增加一个变量)。

function ClassExample{
    this.initiate = function() {
        setTimeOut(objInstance.afterTimeOut,1000); //using the objects global handle
    }

    this.afterTimeOut = function() {
        alert("Received!");
    }

}

var objInstance = new ClassExample(); //instance
objInstance.initiate();

最佳答案

不,你不是。你会想要这样做:

this.initiate = function() {
    setTimeOut(objInstance.afterTimeOut,1000); //using the objects global handle
}

现在,如果“afterTimeout”需要合适的对象上下文,您可以这样做:

this.initiate = function() {
  var instance = this;
  setTimeout(function() { instance.afterTimeOut(); }, 1000);
}

<罢工>

好吧,你通过那个小小的编辑大大改变了问题 :-) 如果我是你,我会这样做(就像我最初的第二个例子):

this.initiate = function() {
  var instance = this;
  setTimeout(function() { instance.afterTimeOut(); }, 1000);
}

那么你根本不需要任何丑陋的全局变量。

编辑 — Stackoverflow 用户@Christoph 评论说这不是特别漂亮。可能有帮助的一件事是使用“绑定(bind)”工具,由较新的浏览器本地提供(作为 Function 原型(prototype)上的方法)或由某些库(例如 Prototype 或 Functional)提供。 “绑定(bind)”让你做的是创建一个小的包装函数,就像我在上面得到的那样:

this.initiate = function() {
  setTimeout(this.afterTimeOut.bind(this), 1000);
}

对“绑定(bind)”的调用返回一个函数,它实际上与我在示例中明确编码的小包装器是同一类东西。

关于javascript - 我是否适本地使用了 Javascript 回调(面向对象的风格)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4728220/

相关文章:

php - 继承和方法参数 PHP

php - 对用于安全登录的更高 Web 根访问权限感到困惑

c++ - 创建注册回调的抽象基类的正确方法

javascript - 检查按钮是否激活

javascript - 有什么方法可以使 javascript 中的嵌套回调代码更具可读性吗?

python - 如何在 Keras 的每个训练时期之后进行预测?

java - 如何访问接口(interface)内的抽象类

c++ - Qt访问类中的mainWindow而不给它对象

javascript - 如何减小 React Native iOS 应用程序的大小?

javascript - React-mapbox-gl _onClickGeolocate() 调用 setTimeout 自动请求位置