Що таке scope і createDelegate() в ExtJS - ME
Часто виникає ситуація при створенні монолітного класу, коли необхідно всередині функції викликати методи чи властивості головного класу. При цьому область видимості зручного для цих цілей це дуже обмежена. ExtJS для такого завдання має дуже зручне рішення.
Припустимо, у нас є клас object1:
У разі викликуobject1.method1(); У нас випаде alert з текстом: «Властивість 1».
Створимо інший клас, назвемо його object2
Тепер спробуємо виконати наступний код: object1.method1.call( object2); У нас випаде alert з текстом: «Властивість object2». Чому так вийшло ? Ми вказали функції при виклику "scope" об'єкт, тобто об'єкт, який функція привласнила this, ніби ми написали в тілі функції this = object2; тому поточним у нас виявився об'єкт object2, а чи не object1.
Коли ми не маємо можливості викликати метод call, це, наприклад, відбувається при створенні нової функції, в ExtJS є спеціальний метод createDelegate, який так само приймає як аргумент «scope» об'єкт, в даному випадку object2:
Тепер якщо ми викличемо нашу створену функціюnewFunction();, то ми також отримаємо alert c текстом: «Властивість object2».
Іноді "scope" об'єкт зручно вказувати через властивість об'єкта. Допустимо у нас є метод у класі AjaxObject, що представляє з себе ajax запит, і є властивість класу property1:
Для того, щоб ми могли щоразу використовувати методи та властивості головного класу AjaxObject, ми прописуємо об'єктам властивість scope:this. Це в першому випадку дозволяє нам легко використовувати метод, звернувшись через this.ajaxSuccess. А в другому випадку, в callback функції використовувати властивість головного класу AjaxObject this.property1.
Scope і createDelegate() є незамінною річчю при побудові великих додатків методом налаштованих класів.