我在这里环顾四周,几乎在其他任何我能想到的地方,但我无法找到解决问题的方法,所以这就是:
在我当前的项目中,我有一个类将对象实例化为其构造函数的一部分,并将其自身传入,以便子对象具有对其父对象的引用。理想情况下,无论如何。然而,最终发生的事情是,孩子获得了父对象的静态视图。 这是我的意思的一个例子:
var myParentClass = new Class({
name: '',
child: null,
initialize: function(){
this.name = 'fred';
this.child = new myChildClass({ parent: this });
this.name = 'george';
this.setFeedback('feedback1');
this.child.setFeedback('feedback2');
},
setFeedback: function(id){
$(id).set('html',this.name);
}
});
var myChildClass = new Class({
Implements: [Options],
options: {
parent: null,
},
initialize: function(options){
this.setOptions(options);
},
setFeedback: function(id){
this.options.parent.setFeedback(id);
}
});
var a = new myParentClass();
在这个例子中,feedback1的内容将是'george',我们希望feedback2的内容是相同的。但事实并非如此。它是'fred',因为它具有父对象的静态视图,其名称属性在作为参数传入对象后更改。为了您的进一步享受,我做了一个jsfiddle来说明这一点。
所以问题是这样的:有没有办法可以让一个子对象有一个真实的实际引用,或者我注定只有一个静态视图?
答案 0 :(得分:4)
这是因为setOptions
方法通过Object.merge将属性解引用到新的Object中,将它们克隆到子实例的本地原型中。
https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.Extras.js#L110
更改构造函数以接受另一个参数,parent和静态存储this.parent = parent
,然后从中调用。
顺便说一下,不要使用.parent
,因为这是在mootools中扩展类时保留的:)