Чистый способ создания и обновления объектов JavaScript?(Мой подход действителен?) - PullRequest
1 голос
/ 28 августа 2011

Я бы хотел чистый способ создания и обновления объектов JavaScript.
Сейчас я использую такой подход:

myApp.chart.GridController = Backbone.Base.extend({

    _defaults : {

        width : 500,
        height : 500,
        indicatorXMin : 100,
        indicatorXMax : 10000, 
        indicatorXScale : "log",

        xScale : undefined,
        yScale : undefined,

        xAxis : undefined,
        yAxis : undefined,

        element : undefined,

    },

    options : {},

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

    update : function(options) {
        this.options = $.extend(this.options, options);
        this.render();
    },

    render : function(){
        this.updateAxes();
        this.draw();
    }

[...]   
  1. Есть ли лучший подход кустановка и переопределение значений по умолчанию?

  2. При использовании этого подхода мне всегда приходится использовать префикс «options» для всех моих переменных, есть ли более обходной путь?

  3. В приведенном выше примере _defaults.xAxis и _defaults.yAxis фактически получены из других переменных.Должны ли они в любом случае попасть внутрь объекта _defaults или где их разместить?(Я бы предпочел не отслеживать, какие переменные являются «производными параметрами», а не ...)


3) РЕДАКТИРОВАТЬ: я имею в виду атрибуты объекта, которыене должны быть переопределены в конструкторе, но должны обновляться на основе других атрибутов.

Не используя $ .extend Я делаю что-то вроде:

var a, b;var c;

конструктор (a, b) this.a = a;this.b = b;

this.c = a + b;

Мне просто интересно, сложно ли поставить c среди значений по умолчанию ...

1 Ответ

0 голосов
/ 28 августа 2011

При таком подходе возникнет проблема, поскольку "$ .extend ()" перезаписывает содержимое первого аргумента. Для «значений по умолчанию» это будет плохо: -)

    this.options = $.extend({}, this._defaults, options);

Это нормальный способ избежать проблемы: передайте совершенно новый пустой объект в качестве первого аргумента, а затем он будет заполнен сначала всеми значениями по умолчанию, а затем всем, что было передано для переопределения. *

На самом деле нет хорошего способа «обойти» необходимость обращаться к переменным через дескриптор «options». Вы можете делать локальные копии, и хотя это локально безопасно, это может привести к ошибкам.

изменить & mdash; Хорошо, теперь, когда я понимаю, что вы имеете в виду (3), я думаю, что я хотел бы вычислить эти свойства после того, как вы расширили значения по умолчанию. Таким образом, даже если клиентский код передает что-то, чего на самом деле не должно быть, вы просто перезапишите это допустимыми значениями.

Итак, что-то вроде:

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