关于初始化器的简单问题

时间:2010-09-14 20:16:19

标签: javascript mootools

这是一个基本问题。遗憾。

我有以下代码:

$extend(ImageCrop, Options.prototype);
Swiff.Uploader = new Class({
    Extends: Swiff,
    Implements: Events,
    options: {
        path: "Swiff.Uploader.swf",
        target: null,
        zIndex: 9999,
        height: 30,
        width: 100,
        callBacks: null,
        params: {
            wMode: "opaque",
            menu: "false",
            allowScriptAccess: "always"
        },
        typeFilter: null,
        multiple: true,
        queued: true,
        verbose: false,
        url: null,
        method: null,
        data: null,
        mergeData: true,
        fieldName: null,
        fileSizeMin: 1,
        fileSizeMax: null,
        allowDuplicates: false,
        buttonImage: null,
        policyFile: null,
        fileListMax: 0,
        fileListSizeMax: 0,
        instantStart: false,
        appendCookieData: false,
        fileClass: null
    },
    initialize: function (b) {
        this.addEvent("load", this.initializeSwiff, true).addEvent("select", this.processFiles, true).addEvent("complete", this.update, true).addEvent("fileRemove", function (e) {
            this.fileList.erase(e)
        } .bind(this), true);
        this.setOptions(b);
        if (this.options.callBacks) {
            Hash.each(this.options.callBacks, function (f, e) {
                this.addEvent(e, f)
            }, this)
        }
        this.options.callBacks = {
            fireCallback: this.fireCallback.bind(this)
        };
        var d = this.options.path;
        if (!d.contains("?")) {
            d += "?noCache=" + $time()
        }
...............................

当我在this.setOptions(b);上设置断点并查看b varible的值时,我看到已初始化的变量,但为什么?我在哪里设定b的值?我把它作为参数传递给我。我认为b的值必须是'null'或其他东西。

2 个答案:

答案 0 :(得分:1)

当您将Options类用作mixin时,它所做的全部是$merge() this.optionsthis.setOptions()上传递了参数。 initialize作为构造函数,mootools中的常规做法是将一个选项对象传递给它。

这是一个示例类:

var foo = new Class({
    Implements: [Options],
    // set defaults.
    options: {
        foo: "bar",
        log: true        
    },
    initialize: function(options) {
        this.report(); // "bar"
        this.setOptions(options); // merge argument options with this.options
        this.report(); // whatever the value of options.foo was
    },
    report: function() {
        if (this.options.log)
            console.log(this.options.foo);
    }

}); 

// this will output bar and then test.
new foo({foo:"test"}).report();

它允许您使用设置/数据填充您的类实例作为实例化可以覆盖的默认值。例如,您也可以传递new foo({log: false});来抑制所有输出。

答案 1 :(得分:0)

如果在该方法中设置断点,则在运行该方法之前不会命中该断点,即在解析定义时但在创建对象时不会。此时,如果设置了b,您可能正在传递参数。 所以,换句话说再说一遍:当你定义上传器时,断点不会被击中。稍后在创建实例时会出现这种情况。