2012-08-14 57 views
1

我环顾了这里,几乎所有我能想到的,但我找不到解决我的问题,所以这里是:如何将对象引用传递给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的内容将是“乔治”,和我们所期待的是feedback2的内容是相同的。但是,事实并非如此。它是'fred',因为它具有父对象的静态视图,其名称属性在对象作为参数传入后发生了更改。为了您的进一步享受,我做了一个jsfiddle来说明这一点。

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

回答

4

这是因为setOptions方法通过Object.merge将属性解引用到新的Object中,将它们克隆到子实例的本地原型中。

https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.Extras.js#L110

变化的构造函数接受另一个说法,家长和静态存储this.parent = parent,然后从该调用。

顺便说一句,不要使用.parent因为这是一种保留,当你在mootools的:)

+0

真棒扩展类。这固定了它。在我的真实项目中,我使用“所有者”而不是父项。 – 2012-08-14 21:04:02

+1

实际上,当我这样做时,出现以下错误: 'Uncaught RangeError:Maximum call stack size exceeded' stack is a whole bunch of calls to'cloneOf Object.extend.clone' – 2012-08-14 23:59:00

+0

这会发生在我在选项之前或之后放置所有者参考,而不是以任何方式重要。 – 2012-08-15 00:03:40

相关问题