03.11.2014, 23:58
|
Кандидат Javascript-наук
|
|
Регистрация: 24.06.2013
Сообщений: 115
|
|
Область видимости конструктора
Я долго-долго думал, как спросить, придумывал что-то заумное, но решил спросить на человеческом языке.
Имитирование привата, в js возможно, но только в конструкторе, от сюда
вытекает раздутый конструктор. Я несколько раз слышал, что много кода
в конструкторе считается не айс.
И в связи со всем этим, у меня возникли вопросы
1) Слышал кто-нибудь о вреде переполнения коструктора, если да,
то почему плохо?
2) Считается ли хорошо использование приватных свойств и методов?
|
|
04.11.2014, 00:31
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Сообщение от riva
|
Имитирование привата, в js возможно, но только в конструкторе
|
Ерунда. У вас неверные представления о js.
Сообщение от riva
|
Слышал кто-нибудь о вреде переполнения коструктора, если да,
то почему плохо?
|
Никаких "переполнений коструктора" не существует.
Сообщение от riva
|
Считается ли хорошо использование приватных свойств и методов?
|
В js не существует приватных свойств и методов. Есть договоренности и прочее, но вариантов много. Неизвестно, о чём конкретно речь.
|
|
04.11.2014, 01:04
|
Кандидат Javascript-наук
|
|
Регистрация: 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.
|
|
04.11.2014, 01:19
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
riva, это всё "бла-бла-бла". В js нет никаких приватных областей и прочее. В общем, тут без кода не разберёшься.
Т.е. твои высказывания непонятны. Поясняй свои мысли кодом. Иначе непонятно о чём речь.
|
|
04.11.2014, 01:33
|
Кандидат Javascript-наук
|
|
Регистрация: 24.06.2013
Сообщений: 115
|
|
Sweet, хочу заметить, что с Вашей стороны. Это Вы без кода наговорили, а потом говорите, что без кода не понятно. А почему сразу не попросили объяснить подробнее? Не стал бы больше отвечать и жил бы с мыслями, что всего этого нет
Не знаю видели ли Вы или нет, но я немного кода добавил.
Он иллюстрирует то, что я называю приватом. Или это глупость и в js так не делают?
|
|
04.11.2014, 03:13
|
|
Аспирант
|
|
Регистрация: 06.09.2014
Сообщений: 41
|
|
в питоне тоже нет приватных свойств/методов. и он прекрасно обходится без них. можешь у приватных свойств в имени подчеркивание использовать, это во многих языках стандарт именования.
|
|
04.11.2014, 08:04
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,577
|
|
Так:
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.
|
|
04.11.2014, 12:18
|
Кандидат Javascript-наук
|
|
Регистрация: 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.
|
|
04.11.2014, 12:34
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,577
|
|
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.
|
|
04.11.2014, 12:52
|
Кандидат Javascript-наук
|
|
Регистрация: 24.06.2013
Сообщений: 115
|
|
Aetae, Спасибо! А делать замыкание в качестве прототипа,
это для js хорошо или так не делают вообще или делают очень редко?
|
|
|
|