Класс jQuery статически разделяет объект между экземплярами класса - PullRequest
1 голос
/ 04 мая 2009

Некоторое время назад мне нужно было создать объектно-ориентированный класс, используя jQuery. Я повернулся, чтобы использовать Джон Резиг прекрасное решение класса.

Хит с этим. Когда я определяю объект глобальных опций, мне кажется, что последний является общим для классов. Я подтвердил это, печатая различные console.log после модификации объекта только в одном классе. Код выглядит так:

var MyClass = Class.extend({
    defaults : {
        distance : 10,
        speed : 20
    },
    options : null,

    init : function(options) {
        this.options = $.extend(this.defaults, options);
    },

    ...
});

Мне нужен глобальный хеш или массив, чтобы я мог легко передать необязательные настройки классу. Есть ли способ сделать это таким образом? Возможно, мне придется прибегнуть к ручным установщикам, если ничего не работает.

Я тоже не совсем уверен, почему объект опций статически распределяется между различными объектами класса, для которых создается ключевое слово 'new'.

Ответы [ 2 ]

1 голос
/ 04 мая 2009

Я могу ошибаться, но попробуйте убрать "var" из "var MyClass". Это создаст MyClass в пространстве имен окна, что по сути делает его глобальным.


UPDATE

Это то, что тебе нужно?

var myObject = function() {
    var defaults = {
                      speed: 20,
                      distance: 10
    };
    var options = null;
    return {
        init: function() { ... },
        setSpeed: function(speed) { this.defaults['speed'] = speed; },
        // etc
    }

}

, а затем назовите его так:

myObject.init(); 

или

myObject.setSpeed(100);

возможно, я не правильно понимаю проблему, и я должен просто stfu

p.s - приведенный выше код взят из памяти и не проверен

0 голосов
/ 26 октября 2009

Они действительно разделяют значение options , но это потому, что вы присвоили модифицированное this.defaults , а не отдельный объект. Из jQuery.extend () документов :

Имейте в виду, что целевой объект будет изменен и будет возвращен из extend ().

Вы можете исправить это, расширив пустой объект значениями по умолчанию, а затем опциями:

    this.options = $.extend({}, this.defaults, options);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...