При таком подходе возникнет проблема, поскольку "$ .extend ()" перезаписывает содержимое первого аргумента. Для «значений по умолчанию» это будет плохо: -)
this.options = $.extend({}, this._defaults, options);
Это нормальный способ избежать проблемы: передайте совершенно новый пустой объект в качестве первого аргумента, а затем он будет заполнен сначала всеми значениями по умолчанию, а затем всем, что было передано для переопределения. *
На самом деле нет хорошего способа «обойти» необходимость обращаться к переменным через дескриптор «options». Вы можете делать локальные копии, и хотя это локально безопасно, это может привести к ошибкам.
изменить & mdash; Хорошо, теперь, когда я понимаю, что вы имеете в виду (3), я думаю, что я хотел бы вычислить эти свойства после того, как вы расширили значения по умолчанию. Таким образом, даже если клиентский код передает что-то, чего на самом деле не должно быть, вы просто перезапишите это допустимыми значениями.
Итак, что-то вроде:
this.options = $.extend({}, this._defaults, options);
this.options.something = someFunction();
this.options.somethingElse = whatever();