尝试从另一个对象访问对象 属性 总是 returns 属性 的初始值
Trying to access object property from another object always returns the property's initial value
我在 PaperScript 中创建了两个 类 对象:Node
s 和 Line
s。每条线都有一个 this.nodes
属性 ,这是一个引用两个 Node 对象的数组,每条线的每一端都有一个。节点有一个 this.dragging
属性,它在创建 Node 对象时被初始化为 false
,但在 onMouseDown
事件中被设置为 true
并被设置回到 false
在 onMouseUp
。这样我就可以跟踪节点是否打算在某个时间点移动。
现在我希望能够从 Line
对象检查其关联节点是否在任何时间点被拖动。为此,我有一个 if 语句来检查是否 (this.nodes[0].dragging == true || this.nodes[1].dragging == true)
。如果 return 为真,则可以采取进一步行动。
问题是两个 this.nodes[i].dragging
s 总是 returns false,无论我是否拖动节点。为什么会这样?特别是当我从 Node
对象中检查 this.dragging
的值时,它会在拖动时 return 正确的值为 true ,否则为 false 。
编辑包括一些代码:
以下是我的代码的精简版。重要的一点是 this.dragging
变量。
function Node(pos) {
///// Stuff
this.dragging = false;
this.node.onMouseDown = function(event) {
this.dragging = true;
// Do other stuff
}
this.node.onMouseDrag = function(event) {
if (this.dragging == true) {
// Do stuff
}
}
this.node.onMouseUp = function(event) {
// Do stuff
this.dragging = false;
}
}
以下是 Line 对象的(部分)构造函数:
function Line(p1, p2) {
this.nodes = [p1, p2];
///// Stuff
this.update = function() {
if (this.nodes[0].dragging === true || this.nodes[1].dragging === true) {
// True
} else {
// False
}
}
}
第二个 EDIT 评论者询问我如何实例化这些对象:
我将它们实例化如下:
var nodeNum = 7;
var lineConnections = [{
from: 0,to: 1}
,{from: 0,to: 2}
,{from: 0,to: 3}
,{from: 0,to: 4}
,{from: 1,to: 2}
,{from: 1,to: 5}
,{from: 2,to: 3}
,{from: 2,to: 4}
,{from: 3,to: 5}
,{from: 4,to: 5}
,{from: 2,to: 5}
]
function init() {
for (var i = 0; i < nodeNum; i++) {
Nodes[i] = new Node();
}
for (var i = 0; i < lineConnections.length; i++) {
Lines[i] = new Line(Nodes[lineConnections[i].from], Nodes[lineConnections[i].to]);
}
}
init();
提供现场演示
我认为问题在于 this
,因为以下代码中的 this.dragging
指的是全局对象 (window),而不是您创建的对象。
this.node.onMouseDown = function(event) {
this.dragging = true;
// Do other stuff
}
this.node.onMouseDrag = function(event) {
if (this.dragging == true) {
// Do stuff
}
}
this.node.onMouseUp = function(event) {
// Do stuff
this.dragging = false;
}
可以通过查看是否创建了全局变量dragging来查看。我无法真正修改您的代码,除非它位于 fiddle 或其他易于使用的位置,但您应该能够通过将每个鼠标处理函数绑定到此来修复它,如下所示:
this.node.onMouseUp = function(event) {
// Do stuff
this.dragging = false;
}.bind(this)
或者通过创建一个闭包,其中包含对 this 的本地引用,该引用不会更改,如:
self = this;
然后从函数内部引用 self
而不是 this
。
我在 PaperScript 中创建了两个 类 对象:Node
s 和 Line
s。每条线都有一个 this.nodes
属性 ,这是一个引用两个 Node 对象的数组,每条线的每一端都有一个。节点有一个 this.dragging
属性,它在创建 Node 对象时被初始化为 false
,但在 onMouseDown
事件中被设置为 true
并被设置回到 false
在 onMouseUp
。这样我就可以跟踪节点是否打算在某个时间点移动。
现在我希望能够从 Line
对象检查其关联节点是否在任何时间点被拖动。为此,我有一个 if 语句来检查是否 (this.nodes[0].dragging == true || this.nodes[1].dragging == true)
。如果 return 为真,则可以采取进一步行动。
问题是两个 this.nodes[i].dragging
s 总是 returns false,无论我是否拖动节点。为什么会这样?特别是当我从 Node
对象中检查 this.dragging
的值时,它会在拖动时 return 正确的值为 true ,否则为 false 。
编辑包括一些代码:
以下是我的代码的精简版。重要的一点是 this.dragging
变量。
function Node(pos) {
///// Stuff
this.dragging = false;
this.node.onMouseDown = function(event) {
this.dragging = true;
// Do other stuff
}
this.node.onMouseDrag = function(event) {
if (this.dragging == true) {
// Do stuff
}
}
this.node.onMouseUp = function(event) {
// Do stuff
this.dragging = false;
}
}
以下是 Line 对象的(部分)构造函数:
function Line(p1, p2) {
this.nodes = [p1, p2];
///// Stuff
this.update = function() {
if (this.nodes[0].dragging === true || this.nodes[1].dragging === true) {
// True
} else {
// False
}
}
}
第二个 EDIT 评论者询问我如何实例化这些对象:
我将它们实例化如下:
var nodeNum = 7;
var lineConnections = [{
from: 0,to: 1}
,{from: 0,to: 2}
,{from: 0,to: 3}
,{from: 0,to: 4}
,{from: 1,to: 2}
,{from: 1,to: 5}
,{from: 2,to: 3}
,{from: 2,to: 4}
,{from: 3,to: 5}
,{from: 4,to: 5}
,{from: 2,to: 5}
]
function init() {
for (var i = 0; i < nodeNum; i++) {
Nodes[i] = new Node();
}
for (var i = 0; i < lineConnections.length; i++) {
Lines[i] = new Line(Nodes[lineConnections[i].from], Nodes[lineConnections[i].to]);
}
}
init();
提供现场演示
我认为问题在于 this
,因为以下代码中的 this.dragging
指的是全局对象 (window),而不是您创建的对象。
this.node.onMouseDown = function(event) {
this.dragging = true;
// Do other stuff
}
this.node.onMouseDrag = function(event) {
if (this.dragging == true) {
// Do stuff
}
}
this.node.onMouseUp = function(event) {
// Do stuff
this.dragging = false;
}
可以通过查看是否创建了全局变量dragging来查看。我无法真正修改您的代码,除非它位于 fiddle 或其他易于使用的位置,但您应该能够通过将每个鼠标处理函数绑定到此来修复它,如下所示:
this.node.onMouseUp = function(event) {
// Do stuff
this.dragging = false;
}.bind(this)
或者通过创建一个闭包,其中包含对 this 的本地引用,该引用不会更改,如:
self = this;
然后从函数内部引用 self
而不是 this
。