javascript - 为什么我的方法无法识别我的对象成员?
问题描述
我正在尝试为 D3 力图创建一个“通用”类。当graphTick()
函数被调用(或任何其他方法似乎......)时,该类的成员值就undefined
好像该方法未绑定到该实例一样。
我想知道我是否误解了编写类的 JS 方式(我来自 C++ 背景),或者我是否误用了 D3 框架。也许两者兼而有之?
我试过换。。。。
simulation.on("tick", this.graphTick)
...经过:
simulation.on("tick", function(){
/*graphTick implementation*/
})
但是看起来它是由 D3 中的一些异常对象调用的,所以我认为我的问题可能更多是关于 JS 语法。
获得了这个类的 Codepen 设置和一个快速测试:https ://codepen.io/mrelemental/pen/VGLNLa
解决方案
您正在使用一个 JavaScript 类,这在 D3 代码中并不常见。使用类本身没有问题,但是在处理this
关键字时必须格外小心。
代码中的问题是函数this
内部的值graphTick
:在"tick"
侦听器中,this
是模拟本身。根据API:
当一个指定的事件被调度时,每个监听器都会被调用,并以
this
上下文作为模拟。
如果你console.log(this)
在函数内部做一个,你可以很容易地自己看到它。你会得到:
{tick: function, restart: function, stop: function, nodes: function, etc...}
这就解释了为什么你的两次尝试都没有奏效:在这两种尝试中,this
都是模拟本身。
解决方案很简单,只需将正确的传递this
给graphTick
函数:
simulation.on("tick", this.graphTick.bind(this))
在这里您可以找到有关以下内容的更多信息bind()
: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind
推荐阅读
- nginx - 如何在 nginx 反向代理中找到请求参数
- c# - 如何正确创建对象列表的列表(主),以便在将项目添加到列表时,它不会添加到列表(主)中的所有列表中?
- laravel - Laravel,按最新创建的子关系排序模型
- javascript - 通过 WebSocket 将数据从 JS 客户端流式传输到 Go 服务器
- c++ - 有和没有 std:: 前缀的数学函数之间的另一个冲突
- laravel - Laravel 8 - “npm run dev” 不工作。sh: 1: mix: 权限被拒绝
- angular - 如何访问我的内容投影指令?
- excel - 从 API 响应下载 excel 文件(Vue.JS - 前端,Flask-后端)
- postgresql - 在 PostgreSQL JSON 中查找结果节点的路径
- flutter - 如何在 Flutter 中运行 Kotlin 函数?