Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.11.2014, 23:58
Кандидат Javascript-наук
Отправить личное сообщение для riva Посмотреть профиль Найти все сообщения от riva
 
Регистрация: 24.06.2013
Сообщений: 115

Область видимости конструктора
Я долго-долго думал, как спросить, придумывал что-то заумное, но решил спросить на человеческом языке.

Имитирование привата, в js возможно, но только в конструкторе, от сюда
вытекает раздутый конструктор. Я несколько раз слышал, что много кода
в конструкторе считается не айс.

И в связи со всем этим, у меня возникли вопросы
1) Слышал кто-нибудь о вреде переполнения коструктора, если да,
то почему плохо?
2) Считается ли хорошо использование приватных свойств и методов?
Ответить с цитированием
  #2 (permalink)  
Старый 04.11.2014, 00:31
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от riva
Имитирование привата, в js возможно, но только в конструкторе
Ерунда. У вас неверные представления о js.
Сообщение от riva
Слышал кто-нибудь о вреде переполнения коструктора, если да,
то почему плохо?
Никаких "переполнений коструктора" не существует.
Сообщение от riva
Считается ли хорошо использование приватных свойств и методов?
В js не существует приватных свойств и методов. Есть договоренности и прочее, но вариантов много. Неизвестно, о чём конкретно речь.
Ответить с цитированием
  #3 (permalink)  
Старый 04.11.2014, 01:04
Кандидат Javascript-наук
Отправить личное сообщение для riva Посмотреть профиль Найти все сообщения от riva
 
Регистрация: 24.06.2013
Сообщений: 115

Цитата:
Ерунда. У вас неверные представления о js.
Любая приватная область, не включая каких-либо фабрик ( я не говорю о простых фабриках ) не будет уникальной для потомков, да и для других инстенсов. Разве я не прав? Расскажите тогда, правильное видение, пожалуйста.
А остальное я уточню потом потом.
Цитата:
Никаких "переполнений коструктора" не существует.
Вы так категорически заявляете, что нет, а вот и есть, я вспомнил и причина сокрыта в самом ООП и называет повторное использование объекта.
Цитата:
Неизвестно, о чём конкретно речь.
Вот о чем -
function Test( ){
        var _prop,
            _method = function( ){
              // ...
            };
        
        this.publicMethod = function( n ){
          return _method( _prop ) + n;
        }
        
      }

Последний раз редактировалось riva, 04.11.2014 в 01:22.
Ответить с цитированием
  #4 (permalink)  
Старый 04.11.2014, 01:19
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

riva, это всё "бла-бла-бла". В js нет никаких приватных областей и прочее. В общем, тут без кода не разберёшься.
Т.е. твои высказывания непонятны. Поясняй свои мысли кодом. Иначе непонятно о чём речь.
Ответить с цитированием
  #5 (permalink)  
Старый 04.11.2014, 01:33
Кандидат Javascript-наук
Отправить личное сообщение для riva Посмотреть профиль Найти все сообщения от riva
 
Регистрация: 24.06.2013
Сообщений: 115

Sweet, хочу заметить, что с Вашей стороны. Это Вы без кода наговорили, а потом говорите, что без кода не понятно. А почему сразу не попросили объяснить подробнее? Не стал бы больше отвечать и жил бы с мыслями, что всего этого нет

Не знаю видели ли Вы или нет, но я немного кода добавил.
Он иллюстрирует то, что я называю приватом. Или это глупость и в js так не делают?
Ответить с цитированием
  #6 (permalink)  
Старый 04.11.2014, 03:13
Аватар для Аркадий Укупник
Аспирант
Отправить личное сообщение для Аркадий Укупник Посмотреть профиль Найти все сообщения от Аркадий Укупник
 
Регистрация: 06.09.2014
Сообщений: 41

в питоне тоже нет приватных свойств/методов. и он прекрасно обходится без них. можешь у приватных свойств в имени подчеркивание использовать, это во многих языках стандарт именования.
Ответить с цитированием
  #7 (permalink)  
Старый 04.11.2014, 08:04
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,028

Так:
function Test( ){
    var _prop,
        _method = function( ){
            // ...
        };

    this.publicMethod = function( n ){
        return _method( _prop ) + n;
    }

}
делать не стоит, ибо все эти методы и свойства будут свои(дублированы) в каждом экземпляре.
Делается всё через прототипы. В js нет специальных приватных методов и свойств, есть соглашение использовать _ перед названием.
function Test( ){
    this.instanceFoo = 'bar';
}
Test.prototype = {
    publicMethod:function( n ){
        return this._method( this._prop ) + n;
    },
    _prop:'prop',
    _method:function( ){
        // ...
    }
}
однако такие методы всё равно доступны извне.
Можно имитировать действительно приватную область через замыкание:
Test = (function(){
    var  _prop = 'prop',
        _method = function( ){
            // ...
        };

    function Test(){
        this.instanceFoo = 'bar';
    }
    
    Test.prototype = {
        publicMethod: function( n ){
            return _method( _prop ) + n;
        }
    }

    return Test
}());
тогда "приватные" функции действительно не будут доступны извне. Подвох тут в том, что "приватные" функции вообще никаким образом не будут доступны извне, т.е. в таком случае уже не получится впоследствии расширить "класс", ибо новые методы никак не смогут получить доступ к изначальной области видимости.
Какой подход выбирать - смотреть вам.
__________________
29375, 35

Последний раз редактировалось Aetae, 04.11.2014 в 08:07.
Ответить с цитированием
  #8 (permalink)  
Старый 04.11.2014, 12:18
Кандидат Javascript-наук
Отправить личное сообщение для riva Посмотреть профиль Найти все сообщения от riva
 
Регистрация: 24.06.2013
Сообщений: 115

Aetae, Спасибо за ответ, но прежде чем я продолжу, хочу отвлечься и спросить - куда запишется свойство name и куда запишется метод parse в коде ниже?
function Test( args ){
	this.init( args );
}

Test.prototype = {
	name: undefined,
	length: NaN,
	init: function( args ){
		this.name = args.name;
		this.length = this.parse( this.name );
	},
	parse: function( args ){
		// ...
		return length;
	}
};


Если я правильно понимаю, то свойство name запишется в объект, а метод parse, хоть и вызовется
с контекстом возвращаемого конструктором объекта, но все равно в него не запишется. Это так?

Последний раз редактировалось riva, 04.11.2014 в 12:29.
Ответить с цитированием
  #9 (permalink)  
Старый 04.11.2014, 12:34
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,028

riva, в экземпляр(при этом свойства в протоипе перезаписаны не будут, просто станут недоступны для текущего экземпляра). В js нет никакой хитрой механики - просто цепочка объектов-прототипов. Как луковица. Когда запрашивается свойство\метод - оное ищется в текущем объекте, если там его нет - ищется в прототипе, нет там - в прототипе прототипа итд. Если производится запись - пишется в самый нижний объект(независимо от того есть ли вышестоящем прототипе подобное свойство).
Если вы хотите сделать некие общие для всех экземпляров параметры, которые при этом можно изменять - делайте объект параметров:
function Test( args ){
    this.init( args );
}
 
Test.prototype = {
    params: {
        name: undefined
    },
    length: NaN,
    init: function( args ){
        this.params.name = args.name;
        this.length = this.parse( this.params.name );
    },
    parse: function( args ){
        // ...
        return length;
    }
};
таким образом запрашивается отдельный объект из прототипа и уже в оный происходит запись.
__________________
29375, 35

Последний раз редактировалось Aetae, 04.11.2014 в 12:38.
Ответить с цитированием
  #10 (permalink)  
Старый 04.11.2014, 12:52
Кандидат Javascript-наук
Отправить личное сообщение для riva Посмотреть профиль Найти все сообщения от riva
 
Регистрация: 24.06.2013
Сообщений: 115

Aetae, Спасибо! А делать замыкание в качестве прототипа,
это для js хорошо или так не делают вообще или делают очень редко?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пож с JSON, передача id ссылки. wisma jQuery 22 10.02.2014 14:36
Область видимости переменной ацкий Общие вопросы Javascript 3 27.08.2011 14:09
область видимости Ultimatum Общие вопросы Javascript 2 19.06.2011 10:47
область видимости переменных jetli13 Общие вопросы Javascript 3 17.09.2010 11:00
можно ли включить функцию в глобальную область видимости из файла maxval Элементы интерфейса 13 04.10.2009 07:11