Class javaScript

```
﻿

// Описание тестового класса JS с набором всех используемых конструкций и способов их описания.

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

var CLASS_NAME = function(){
 // =============== //
 // Основной экземпляр объекта класса, нужен для доступа к нему изнутри, не по имени CLASS_NAME.
 // В нём же набор всех паблик параметров и методов.
 var $class_obj = {};
 console.log('Выполняется непосредственно внутри CLASS_NAME');
 // =============== //
 var default_options = {
 testOption: 'test'
 };

// =============== //
 // Описание !приватных! статик полей.
 var testParam = "test";
 var static_private_param_2 = "";
 var static_private_param_3 = "";
 // =============== //

// =============== //
 // Описание статик функций (српеди них могут быть как приватные, так и паблики. Как либо их помечать тяжело ,поэтому они общие.)
 function somePublicStaticFunction1(){
 // Не имеет доступа к конкретному инстансу и не должна!
 }
 function somePublicStaticFunction2(){
 // Не имеет доступа к конкретному инстансу и не должна!
 }
 function somePrivateStaticFunction(){
 // Не имеет доступа к конкретному инстансу и не должна!
 }
function printAllInstances(){
 console.log($class_obj.instances);
 }
function printAllInstancesFromInstance(){
 console.log('printAllInstancesFromInstance');
 var size = 0, key;
 for (key in $class_obj.instances) {
 if ($class_obj.instances.hasOwnProperty(key)) size++;
 console.log("instance: ");
 console.log($class_obj.instances[key]);
 $class_obj.instances[key].printThisName();
}

}
// =============== //

// =============== //
 // Тут функция создания объекта класса.
 // Все функции относящиеся к объектам описываются внутри этой функции.
 function createInstance(options){
 console.log('createInstance options:');
 console.log(options);
 var merged_options = $.extend({}, default_options, options);
 console.log("merged options:");
 console.log(merged_options);
 // -------------- //
 // Описание инстанса объекта (стоит понимать .что у класса может быть много объектов).
 var $instance = {
 options: merged_options
 };
 // -------------- //
 // -------------- //
 // Всевозможные приватные поля объекта
 var instance_id = $.assocArraySize($class_obj.instances);
 var private_param_1 = "";
 var private_param_2 = "";
 var private_param_3 = "";
 // -------------- //
// -------------- //
 // Функции объекта, так же как у класса могут быт ьприватные и паблики.
 function somePublicFunction1(){
 $instance.public_func_1();
 }
 function somePublicFunction2(){
 $instance.public_func_1();
 }
 function somePrivateFunction(){
 $instance.public_func_1();
 }
 function printThisName(){
 console.log('printThisName:');
 console.log(merged_options.name);
 }
 // -------------- //

// -------------- //
 // Описание паблик полей и методов инстансов.
 // обязательно тут описать ВСЕ поля.
 // Это паблик поля экземпляров класса
 $instance = {
 dynNameOfInstance: merged_options.name,
 staticNameOfInstance: "static name",
 public_param_1: "",
 public_param_2: "",
 public_param_3: "",
 public_func_1: somePublicFunction1,
 public_func_2: somePublicFunction2,
 printThisName: printThisName
 };
 // -------------- //

// -------------- //
 // Использовать функции из статика тут так.
 // Также вся логика тут обёрнутая в функции только!
 somePrivateStaticFunction();
 $class_obj.public_static_func_1();
 $class_obj.instances[instance_id] = $instance;
 // -------------- //

console.log('$class_obj.instances');
 console.log($class_obj.instances);

console.log("instance lnegth:");
 console.log($.assocArraySize($class_obj.instances));

return $instance;
 }
 // =============== //

// =============== //
// Это публичные методы и поля, относящиеся только к классу(не к инстансу(не к экземпляру))
// Тут структура класса содержащая все паблик статик поля и методы.
 // Методы не описываем, а юзаем имена функций!
 $class_obj = {
 instances: {},
 create: createInstance,
 nameOfClass: "static class name",
 public_static_param_1: "",
 public_static_param_2: "",
 public_static_param_3: "",
 public_static_func_1: somePublicStaticFunction1,
 public_static_func_2: somePublicStaticFunction2,
 printAllInstances: printAllInstances,
 printAllInstancesFromInstance: printAllInstancesFromInstance
};
 // =============== //

// =============== //
 // Сюда доп инициализации или навешивание функций добавляющих эвенты.
 somePrivateStaticFunction();
 // =============== //

return $class_obj;
}();

$.assocArraySize = function(obj) {
 // http://stackoverflow.com/a/6700/11236
 var size = 0, key;
 for (key in obj) {
 if (obj.hasOwnProperty(key)) size++;
 }
 return size;
};

```