Простой вопрос об инициализаторе - PullRequest
0 голосов
/ 15 сентября 2010

Это основной вопрос. К сожалению.

У меня есть следующий код:

$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, я вижу уже инициализированную переменную, но почему? Где я устанавливаю значение b? Я просто передаю это как параметр. Я думаю, что значение b должно быть нулевым или что-то в этом роде.

Ответы [ 2 ]

1 голос
/ 15 сентября 2010

когда вы используете класс Options в качестве миксина, все, что он делает, это $merge() из this.options с аргументами, передаваемыми в this.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});, который подавит весь вывод.

0 голосов
/ 15 сентября 2010

Если вы установите точку останова в этом методе, она не будет достигнута до тех пор, пока вы не запустите метод, т. Е. Не при разборе определения, а при создании объекта. В этот момент вы, вероятно, передаете аргумент, если установлено b. Итак, чтобы повторить это другими словами: когда вы определяете свой загрузчик, точка останова не достигается. Это ударил позже, когда вы создаете экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...