Что такое private в js?

Если честно сказать, то первый вопрос о private, принес мне ещё больше вопросов. По этому отважился сделать вторую попытку, но уже более конкретизировать вопросы.
Во первых, как я выяснил, приватные свойства и методы нужны :
Инкапсуляция это всегда хорошо.

Инкапсуляция нужна.

Правда все плюсы за инкапсуляцию были разбавлены особенностями js...
Но! Хорошим тоном программирования на js являются модули и как не крути, они предоставляют приватную область, о которой я и хочу все разузнать.

Первым делом отправился смотреть исходники AngularJS и не увидел так,
как многие советуют, _подчеркивания приватных свойств. И отсюда вопрос номер один
1) Почему в самом популярном на сегодняшний день AngularJS нет подчеркивания _приватных свойств и методов. Возможно, подчеркивание не есть хорошо в js?

Второй вопрос заключается в детальном разборе "private scope" на примере первого попавшегося класса из вышеупомянутого AngularJS вот этот класс. И сам вопрос
2) Код этого файла, это модуль?
Забегая вперед, предположу, что на второй вопрос ответ был положительным и я преступлю к третьему вопросу.
Взяв, "обезжирив" и немного переделав по себя, код модуля из второго вопроса задаю третий
var module = ( function( ){
	// private props
	var propOne,
		propTwo;
	// эту облать Вы называете приватной скопой?
	function CustomObject( ){
		// методы methodOne и methodTwo
		// можно использовать здесь и
		// именно их Вы называете приватными?
	}

	CustomObject.prototype = {
		// public props
		constructor: CustomObject,
		// public methods
		
		// методы methodOne и methodTwo
		// можно использовать здесь и
		// именно их Вы называете приватными? 
	};

	// вот такие методы есть в коде из AngularJS
	// это считаются приватные методы для CustomObject?
	function methodOne( ){

	}

	function methodTwo( ){

	}

	return CustomObject;
}( ) );

3) Правильно ли я понял о приватных скопах?

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

И у меня ещё небольшая просьба, если кто-то знает, видео ( на русском ) или очень хорошую иллюстрацию прототипов, ссылок на конструкторы и прочие при наследовании, поделитесь.
  • Вопрос задан
  • 3547 просмотров
Решения вопроса 2
barmaley_exe
@barmaley_exe
Не писал на JS несколько лет, Angular, соответственно, тоже не трогал, но пока ES6 не вышел и на дворе ECMAScript 5:

1. Потому что _подчёркивания, __двойныеПодчёркивания и __любыеДругиеПодчёркивания__ никак не контроллируют область видимости. Но есть механизмы, позволяющие ограничить доступ видимости.

2. Объявление модуля с помощью вызова анонимной функции. Фишка анонимной функции заключается в том, что она создаёт область видимости, где можно хранить все эти приватные переменные (методы в том числе). Любая локальная переменная будет доступна (благодаря замыканиям) любой функции, объявленной там же, а функции эти можно "экспортировать" наружу, вернув их (или объект с ними).

3. Термина private scope никогда не слышал, в ES5 есть function scope и global scope. Вложенная функция имеет доступ к scope "родительской" функции, у всех есть доступ к global scope (своего рода функция нулевого уровня).

Советую почитать цикл статей Дмитрия Сошникова по Тонкостям JavaScript. Статьям уже 5 лет, но они покрывают основу ECMAScript, которая ещё справедлива и по сей день. Возможно, это изменится с выходом ES6.
Ответ написан
mlnkv
@mlnkv
JavaScript Developer
Я вот не пойму, чем писать такие "простыни" на форумах не лучше ли прочитать толковую литературу по данной теме?
vk.com/doc121030996_322523578
vk.com/doc12738850_269339022

подчеркивание - чисто условный способ обозначить приватные методы, его редко используют.
а вообще, в ссылке на кусок кода - это класс, модуль не немного иначе. Для класса можно создать несколько экземпляров, а модуль у нас в единственном экземпляре.

function MyClass() {
  var prop = "Hello"; // private prop.
  this.prop = "World"; // public prop.

  function foo() { // private method
    return prop + this.prop; 
  }

  this.foo = function() { // public method
    return foo();
  }
}


largescalejs.ru
largescalejs.ru/module-pattern
модуль
var basketModule = (function() {
  var basket = []; // приватная переменная
    return { // методы доступные извне
        addItem: function(values) {
            basket.push(values);
        },
        getItemCount: function() {
            return basket.length;
        },
        getTotal: function() {
           var q = this.getItemCount(),p=0;
            while(q--){
                p+= basket[q].price; 
            }
            return p;
        }
    }
}());


PS а книги читать все равно надо))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы