Область видимости конструктора
Я долго-долго думал, как спросить, придумывал что-то заумное, но решил спросить на человеческом языке.
Имитирование привата, в js возможно, но только в конструкторе, от сюда вытекает раздутый конструктор. Я несколько раз слышал, что много кода в конструкторе считается не айс. И в связи со всем этим, у меня возникли вопросы 1) Слышал кто-нибудь о вреде переполнения коструктора, если да, то почему плохо? 2) Считается ли хорошо использование приватных свойств и методов? |
Цитата:
Цитата:
Цитата:
|
Цитата:
А остальное я уточню потом потом. Цитата:
Цитата:
function Test( ){ var _prop, _method = function( ){ // ... }; this.publicMethod = function( n ){ return _method( _prop ) + n; } } |
riva, это всё "бла-бла-бла". В js нет никаких приватных областей и прочее. В общем, тут без кода не разберёшься.
Т.е. твои высказывания непонятны. Поясняй свои мысли кодом. Иначе непонятно о чём речь. |
Sweet, хочу заметить, что с Вашей стороны. Это Вы без кода наговорили, а потом говорите, что без кода не понятно. А почему сразу не попросили объяснить подробнее? Не стал бы больше отвечать и жил бы с мыслями, что всего этого нет :)
Не знаю видели ли Вы или нет, но я немного кода добавил. Он иллюстрирует то, что я называю приватом. Или это глупость и в js так не делают? |
в питоне тоже нет приватных свойств/методов. и он прекрасно обходится без них. можешь у приватных свойств в имени подчеркивание использовать, это во многих языках стандарт именования.
|
Так:
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 }());тогда "приватные" функции действительно не будут доступны извне. Подвох тут в том, что "приватные" функции вообще никаким образом не будут доступны извне, т.е. в таком случае уже не получится впоследствии расширить "класс", ибо новые методы никак не смогут получить доступ к изначальной области видимости. Какой подход выбирать - смотреть вам. |
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, в экземпляр(при этом свойства в протоипе перезаписаны не будут, просто станут недоступны для текущего экземпляра). В 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; } };таким образом запрашивается отдельный объект из прототипа и уже в оный происходит запись. |
Aetae, Спасибо! А делать замыкание в качестве прототипа,
это для js хорошо или так не делают вообще или делают очень редко? |
Часовой пояс GMT +3, время: 09:17. |