我试图将一个物体从另一个物体发送给另一个物体。
var Tile = new Class({
initialize : function(){
this.inner = new Element(...);
this.inner.addEvent('click', function() {
popup.open(this);
});
}
});
如果我警告任何成员变量来自Tile out op Popup,它会警告'undefined'。 我做错了什么?
var Popup = new Class({
initialize : function(){
},
open : function(tile) {
alert(tile.width);
}
});
亲切的问候!
答案 0 :(得分:2)
当您将this
传递给popup
对象时,您传递的是元素本身(我相信这是您的意图)。但是,默认情况下,元素不具有名为width
的属性。
也许您正在寻找getSize();
?这将返回一个双属性对象(x
和y
),分别对应于元素的宽度和高度。
我已将您的代码近似为以下jsFiddle,请尝试一下:http://jsfiddle.net/g4SmJ/
供参考,这是新的Popup
类代码:
var Popup = new Class({
initialize : function(){
},
open : function(tile) {
size = tile.getSize();
console.log(size); // console.log provides a nicer interface for debugging, you can pass objects into it! Use the Chrome Inspector or Firebug to see its output.
alert(size.x);
}
});
回应你的评论:
哦,我并不打算提醒doms宽度,对不起。我发布的是来自完整对象的较小代码。宽度实际上是Tiles中定义的成员,我想要提醒Popup
在这种情况下,当您将呼叫发送到.open();
时,您将this
传递给函数调用,但您没有传递Tile
对象!相反,您传递了您创建的inner
元素。
如此重写Tile
:
var Tile = new Class({
initialize : function(){
var self = this;
this.inner = new Element(...);
this.inner.addEvent('click', function() {
popup.open(self);
});
}
});
答案 1 :(得分:1)
我猜你想要发送Tile
个实例。
与上面的答案一样 - 当您在this
方法内发送addEvent
时,您发送的元素本身就是调用事件:在您的情况下,您正在发送内部实例,因为您在其上定义了onclick。
如果要发送磁贴实例,则有2个选项:
1)绑定到函数this - 意味着“连接”您在(Tile)中的当前范围到事件中:
var Tile = new Class({
initialize : function(){
this.inner = new Element(...);
this.inner.addEvent('click', function() {
popup.open(this); // <- now this is 'Tile' instance
}.bind(this)); //bind this to click
}
});
2)将实例保存在函数范围之外并在其中使用:
var Tile = new Class({
initialize : function(){
this.inner = new Element(...);
var self = this; //save the this to var 'self'
this.inner.addEvent('click', function() {
popup.open(self); //use self which holds the Tile instance
});
}
});