2011-12-01 77 views
4

有没有做从以下....引用自己的对象属性

var myObject = { 
    name: "Johnny", 
    init: function() { 
     $("body").mousemove(this.setStatus); 
    }, 
    setStatus: function(ev) { 
     $("body").append("<div>Mouse Move by: " + myObject.name + "</div>"); 
    } 
}; 

myObject.init(); 

这是这样引用当创建一个类的对象的财产的最好方式(即调用myObject.name问题setStatus函数)?

回答

1

这很好。如果setStatus未在其他地方使用,则可以将其移至匿名函数并将其传递至mousemove

2

它看起来就像你知道,当this.setStatus被触发变量this上下文将把接收到事件的元素(即你的<body>),而不是myObject

但是你真的不应该在对象本身中引用myObject - 对象应该不知道它在它自己之外被称为什么。

要解决,你可以通过this作为附加参数.mouseMove这样的:

$("body").mousemove(this, this.setStatus); 

,然后你的事件处理程序中,你可以检索通过事件的data领域当前的对象引用:

setStatus: function(ev) { 
    var self = ev.data; 
    $("body").append("<div>Mouse Move by: " + self.name + "</div>"); 
} 
+0

为什么不应该对象引用自身?你有建议这样做的技术原因吗? –

+0

@JohnnyRambo这是糟糕的OO设计。你目前可以做'var tmp = myObject; myObject = null',你的代码就会中断。我所建议的更改将您的实现的_internals_从_external_引用中分离出来,通过该引用您的对象已知,并允许代码继续工作。 – Alnitak

+0

我想到了,但我以这种方式创建对象的原因是因为不会有该类的任何其他实例,也不会将其设置为null。尽管如此,我仍然会将你所建议的改变变得更安全。谢谢。 –

0

您需要确保this仍然可用。将函数传递给事件处理函数时,this将指向相关的DOM节点。

既然你使用jQuery,您可以使用$.proxy()绑定this功能里面别的东西:

$("body").mousemove($.proxy(this.setStatus, this)); 

然而,这将是更清洁,使可以从别的途径原this

var myObject = { 
    name: "Johnny", 
    init: function() { 
     var self = this; 
     $("body").mousemove(function(ev) { 
      self.setStatus.call(this, ev, self); 
     }); 
    }, 
    setStatus: function(ev, self) { 
     $("body").append("<div>Mouse Move by: " + self.name + "</div>"); 
    } 
}; 
+0

可以工作,但是随后打破了事件处理程序中的'this'引用接收事件的元素的约定。 – Alnitak

0

这种方式很好。这样做是只传递一个匿名函数来鼠标移动的另一种方法:

var myObject = { 
    name: "Johnny", 
    init: function() { 
     var thisObject = this; 
     $("body").mousemove(function() { 
      $("body").append("<div>Mouse Move by: " + thisObject.name + "</div>"); 
     }); 
    } 
}; 

myObject.init(); 

fiddle

相关问题