如何将对象引用传递给mootools中另一个对象的构造函数?

时间:2012-08-14 19:01:05

标签: javascript mootools

我在这里环顾四周,几乎在其他任何我能想到的地方,但我无法找到解决问题的方法,所以这就是:

在我当前的项目中,我有一个类将对象实例化为其构造函数的一部分,并将其自身传入,以便子对象具有对其父对象的引用。理想情况下,无论如何。然而,最终发生的事情是,孩子获得了父对象的静态视图。 这是我的意思的一个例子:

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来说明这一点。

所以问题是这样的:有没有办法可以让一个子对象有一个真实的实际引用,或者我注定只有一个静态视图?

1 个答案:

答案 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中扩展类时保留的:)