Я провел некоторое исследование на форуме ExtJS относительно закрытых методов и полей в расширенном классе, и я не мог найти реальный ответ на это.
И когда я говорю, что расширенный класс имею в виду что-то вроде этого:
Ext.ux.MyExtendedClass = Ext.extend(Ext.util.Observable, {
publicVar1: 'Variable visible from outside this class',
constructor: function(config) { this.addEvents("fired"); this.listeners = config.listeners; }, // to show that I need to use the base class
publicMethod1: function() { return 'Method which can be called form everywhere'; },
publicMethod2: function() { return this.publicMethod1() + ' and ' + this.publicVar1; } // to show how to access the members from inside another member
});
Проблема здесь состоит в том, что все общедоступно. Так, как я добавляю новую переменную o метод в рамках MyExtendedClass, к которому нельзя получить доступ снаружи, но может быть доступом открытыми методами?
Я использую что-то вроде следующего .
var toolbarClass = Ext.extend( Ext.Container,
{
/**
* constructor (public)
*/
constructor: function( config )
{
config = config || {};
// PRIVATE MEMBER DATA ========================================
var accountId = Ext.id( null, 'ls-accountDiv-');
// PUBLIC METHODS ========================================
this.somePublicMethod = function(){
console.log( accountId );
};
...
В следующем примере показан способ верхнего уровня для определения привилегированных частных и общедоступных членов . Но также показано, как определить частные статические члены (также называемые членами класса ) и общедоступные непривилегированные члены . Используя эти последние 2 вместо привилегированных, мы сократим время инициализации, поскольку они не анализируются каждый раз, когда вы создаете новый объект вашего класса:
Ext.ux.MyExtendedClass = Ext.extend (Ext.util.Observable, (function () {// частные статические поля (доступ возможен только в области видимости: минимальные привилегии).var privStaticVar = 0; // частные статические функции (могут иметь доступ только к области видимости и аргументам, но мы можем отправить им область действия параметром) var privateFunc1 = function (me) {return me.name + '-> ClassVar:' + privStaticVar; }; var privateFunc2 = function (me) {return me.publicMethod1 () + 'InstanceVar:' + me.getPrivateVar (); }; return {constructor: function (config) {// привилегированные частные / общедоступные члены (могут получить доступ ко всему частному и общедоступному) var privateVar = config.v || 0; вар PrivInstFunc = функция () {privateVar + = 1; }; this.name = config.name; this.incVariables = функция () {privInstFunc (); privStaticVar + = 1; }; this.getPrivateVar = функция () {return privateVar; }; }, // открытые члены (могут иметь доступ к открытым и закрытым статическим элементам, но не к членам, определенным в конструкторе) publicMethod1: function () {this.incVariables (); return privateFunc1 (это); }, publicMethod2: function () {return privateFunc2 (this); }}; } ())); функция test () {var o1 = new Ext.ux.MyExtendedClass ({name: 'o1', v: 0}); var o2 = новый Ext.ux.MyExtendedClass ({имя: 'o2', v: 10}); var s = o1.publicMethod2 () + '
' + o1.publicMethod2 () + '
' + o2.publicMethod2 () + '
' + o2.publicMethod2 (); Ext.get ("вывод"). Update (s); }
Нажмите кнопку, чтобы создать 2 объекта и вызвать каждый объект 2 раза:
Вы можете нажать нажмите кнопку еще раз, чтобы повторить. Вы увидите, что статическая переменная продолжает увеличивать свое значение.