Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Область видимости конструктора (https://javascript.ru/forum/misc/51353-oblast-vidimosti-konstruktora.html)

riva 03.11.2014 23:58

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

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

И в связи со всем этим, у меня возникли вопросы
1) Слышал кто-нибудь о вреде переполнения коструктора, если да,
то почему плохо?
2) Считается ли хорошо использование приватных свойств и методов?

Sweet 04.11.2014 00:31

Цитата:

Сообщение от riva
Имитирование привата, в js возможно, но только в конструкторе

Ерунда. У вас неверные представления о js.
Цитата:

Сообщение от riva
Слышал кто-нибудь о вреде переполнения коструктора, если да,
то почему плохо?

Никаких "переполнений коструктора" не существует.
Цитата:

Сообщение от riva
Считается ли хорошо использование приватных свойств и методов?

В js не существует приватных свойств и методов. Есть договоренности и прочее, но вариантов много. Неизвестно, о чём конкретно речь.

riva 04.11.2014 01:04

Цитата:

Ерунда. У вас неверные представления о js.
Любая приватная область, не включая каких-либо фабрик ( я не говорю о простых фабриках ) не будет уникальной для потомков, да и для других инстенсов. Разве я не прав? Расскажите тогда, правильное видение, пожалуйста.
А остальное я уточню потом потом.
Цитата:

Никаких "переполнений коструктора" не существует.
Вы так категорически заявляете, что нет, а вот и есть, я вспомнил и причина сокрыта в самом ООП и называет повторное использование объекта.
Цитата:

Неизвестно, о чём конкретно речь.
Вот о чем -
function Test( ){
        var _prop,
            _method = function( ){
              // ...
            };
        
        this.publicMethod = function( n ){
          return _method( _prop ) + n;
        }
        
      }

Sweet 04.11.2014 01:19

riva, это всё "бла-бла-бла". В js нет никаких приватных областей и прочее. В общем, тут без кода не разберёшься.
Т.е. твои высказывания непонятны. Поясняй свои мысли кодом. Иначе непонятно о чём речь.

riva 04.11.2014 01:33

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

Не знаю видели ли Вы или нет, но я немного кода добавил.
Он иллюстрирует то, что я называю приватом. Или это глупость и в js так не делают?

Аркадий Укупник 04.11.2014 03:13

в питоне тоже нет приватных свойств/методов. и он прекрасно обходится без них. можешь у приватных свойств в имени подчеркивание использовать, это во многих языках стандарт именования.

Aetae 04.11.2014 08:04

Так:
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
}());
тогда "приватные" функции действительно не будут доступны извне. Подвох тут в том, что "приватные" функции вообще никаким образом не будут доступны извне, т.е. в таком случае уже не получится впоследствии расширить "класс", ибо новые методы никак не смогут получить доступ к изначальной области видимости.
Какой подход выбирать - смотреть вам.

riva 04.11.2014 12:18

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, хоть и вызовется
с контекстом возвращаемого конструктором объекта, но все равно в него не запишется. Это так?

Aetae 04.11.2014 12:34

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;
    }
};
таким образом запрашивается отдельный объект из прототипа и уже в оный происходит запись.

riva 04.11.2014 12:52

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


Часовой пояс GMT +3, время: 13:31.