В чем смысл Ext.apply или просто устанавливать значения для цели?

Используя Ext.js или sencha, нужно сделать следующее:

Ext.apply(app.views, {
        contactsList: new app.views.ContactsList(),
        contactDetail: new app.views.ContactDetail(),
        contactForm: new app.views.ContactForm()
    });

В отличие от этого стандартного javascript:

app.views.contactsList = new app.views.ContactsList();
app.views.contactDetail = new app.views.ContactDetail();
app.views.contactForm = new app.views.ContactForm();

Есть ли разница?

Ответ 1

В основном это метод удобства для кода, который принимает объект как аргумент, и ему необходимо объединить его. Объединение объектов является распространенным прецедентом в JavaScript, и этот тип помощника реализуется большинством фреймворков. ($.extend в jQuery, Object.extend в Prototype, Object.append в MooTools и т.д.)

В вашем случае есть небольшая разница, кроме предложения более читаемого кода.

Ответ 2

Ext.apply, как правило, более удобен (и, возможно, более эффективен, если требуется меньше поисковых запросов активации, как в вашем примере, хотя это небольшая точка). Существует также вариант Ext.applyIf, который применяет только те элементы исходного объекта, которые не существуют в целевом объекте, что еще более полезно, поскольку оно избавляет вас от загрузки ручных проверок if(). Это действительно полезно, например, при применении умолчаний к объекту конфигурации, у которого уже могут быть назначены пользовательские или определенные приложения.

Примечание для будущих читателей, которые рассматривают принятый ответ: Ext также имеет Ext.extend, который на самом деле означает "наследовать" от класса, а не Ext.apply[If], который просто объединяет экземпляр объекта в другой или Ext.override который переопределяет (без подкласса) определение класса. Множество вариантов, в зависимости от того, что вам нужно.

Ответ 3

Вам нужно Ext.apply, если вы используете запросы Ajax для получения конфигураций с сервера. Поскольку ответы Ajax получены позже, после визуализации окна. Вторая часть вашего кода не будет работать.