尝试从另一个对象访问对象 属性 总是 returns 属性 的初始值

Trying to access object property from another object always returns the property's initial value

我在 PaperScript 中创建了两个 类 对象:Nodes 和 Lines。每条线都有一个 this.nodes 属性 ,这是一个引用两个 Node 对象的数组,每条线的每一端都有一个。节点有一个 this.dragging 属性,它在创建 Node 对象时被初始化为 false,但在 onMouseDown 事件中被设置为 true 并被设置回到 falseonMouseUp。这样我就可以跟踪节点是否打算在某个时间点移动。

现在我希望能够从 Line 对象检查其关联节点是否在任何时间点被拖动。为此,我有一个 if 语句来检查是否 (this.nodes[0].dragging == true || this.nodes[1].dragging == true)。如果 return 为真,则可以采取进一步行动。

问题是两个 this.nodes[i].draggings 总是 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();

http://aronadler.com/experiment/

提供现场演示

我认为问题在于 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