1

我已经环顾了这里,几乎所有我能想到的其他地方,但我找不到解决我的问题的方法,所以这里是:

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

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

所以问题是这样的:有什么方法可以让子对象对其父对象有真正的实际引用,还是我注定只能拥有静态视图?

4

1 回答 1

4

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

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

更改构造函数以接受另一个参数 parent 和 statically store this.parent = parent,然后从中调用。

顺便说一句,不要使用.parent,因为这是在 mootools 中扩展类时保留的 :)

于 2012-08-14T20:26:04.100 回答