MooTools Class对象和'this'

时间:2010-01-27 05:14:08

标签: class mootools

假设我有这门课。

BucketList = new Class({

Implements: [Options, Events],

options: {
    items: [],
    onItemAddedOrDeleted: null
},

initialize: function(options, init) {
    this.setOptions(options);
    this.options.onItemAddedOrDeleted();
}
});

我怎样才能让它发挥作用?

new BucketList([], function() {
    alert(this.items.length);
});

一旦实例化,new BucketList应该警告我传入其构造函数的数组的长度。

1 个答案:

答案 0 :(得分:4)

这里有几个问题。一个是您正在实施Events,因此onItemAddedOrDeleted选项成为Class实例事件(请参阅setOptions的文档)。因此,您无法将onItemAddedOrDeleted作为普通函数调用,因为它将成为一个事件侦听器,等待您触发“itemAddedOrDeleted”事件。

二,作为选项的一部分传递函数的语法稍微偏离,因为您需要将自定义init函数作为options对象的一部分传递。我稍微重写了你的代码以使用fireEvent而不是直接调用函数,但是如果你想直接调用它,你可以重命名它以不使用事件语法(即以'on'开头) )。这虽然有效:

BucketList = new Class({    
    Implements: [Options, Events],  
    options: {
        items: [],
        onItemAddedOrDeleted: null
    },  
    initialize: function(options) {
        this.setOptions(options);
        this.fireEvent('itemAddedOrDeleted');
    }
});

new BucketList({items:[],onItemAddedOrDeleted:function() {
    alert(this.options.items.length);
}});

请注意,我将作为选项对象的一部分传递给BucketList构造函数的函数包围了。

您可以在不使用Event语法的情况下执行此操作:

BucketList = new Class({    
    Implements: [Options, Events],  
    options: {
        items: [],
        itemAddedOrDeleted: null
    },  
    initialize: function(options) {
        this.setOptions(options);
        this.options.itemAddedOrDeleted();
    }
});    

var x = new BucketList({items:['x'],itemAddedOrDeleted:function() {
    alert(this.items.length);
}});