尝试从另一个对象访问对象属性始终返回属性的初始值

时间:2015-10-18 23:48:35

标签: javascript paperjs

我在PaperScript中创建了两类对象:NodeLine。每行都有一个this.nodes属性,该属性是一个引用两个Node对象的数组,每个对象用于该行的每一端。节点具有this.dragging属性,在创建Node对象时初始化为false,但在true事件中设置为onMouseDown并重新设置为{{1在false。这样我就可以跟踪节点是否打算在某个时间点移动。

现在我希望能够检查onMouseUp个对象是否在任何时间点拖动了相关的节点。为此,我有一个if语句来检查是否Line。如果返回true,则可能发生进一步的操作。

问题是(this.nodes[0].dragging == true || this.nodes[1].dragging == true)总是返回false,无论我是否在拖动Node。为什么会这样?特别是当我从this.nodes[i].dragging对象中检查this.dragging的值时,它确实在拖动时返回正确的值,否则返回false。

EDIT包含了一些代码:

以下是我的代码的精简版本。重要的是Node变量。

this.dragging

以下是Line对象的构造函数的一部分:

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;
  }
}

第二个EDIT评论者请求我如何实例化这些对象:

我将它们实例化如下:

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
    }
  }
}

http://aronadler.com/experiment/

提供现场演示

1 个答案:

答案 0 :(得分:1)

我认为问题是this,如下面代码中this.dragging引用的是全局对象(窗口),而不是您创建的对象。

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; }

您可以通过查看是否已创建全局变量拖动来进行检查。我无法修改您的代码,除非它在小提琴或其他易于使用的位置,但您应该能够通过绑定每个鼠标处理函数来修复它对此如下: this.node.onMouseUp = function(event) { // Do stuff this.dragging = false; }.bind(this) 或者通过创建一个具有本地引用的闭包,该闭包不会发生变化,如:

self = this;

然后从函数中引用self而不是this