Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Best practice ООП в JS (https://javascript.ru/forum/misc/48429-best-practice-oop-v-js.html)

GlaIZier 03.07.2014 16:39

Best practice ООП в JS
 
Здравствуйте, форумчане!

Пишу на JS не очень давно. В основном пишу на Java, поэтому нубовский вопрос. Как правильно организовывать код в JS, если ты хочешь сделать нечто похожее на класс? Есть best practice?

И еще. До этого писал так:

var Class = {};
 
 var Class._args = {}; // private
 
 Class.init = function(Args) { // "constructor"
    _args = Args;
 }

 Class.helloWorld = function() {  // api for Сlass
     alert(_args[0]);
 }

var obj = Object(Class);


А сейчас наткнулся на такой вариант:
var Class= Class || (function(){
    var _args = {}; // private

    return {
        init : function(Args) {
            _args = Args;
            // some other initialising
        },
        helloWorld : function() {
            alert('Hello World! -' + _args[0]);
        }
    };
}());


Не совсем понимаю, в чем между ними принципиальная разница? Зачем городить еще одну функцию "поверх" всего объекта?

Спасибо большое!


UPD.

Кажется понял... Во втором случае используется замыкание и извне _args не видна.

Sweet 03.07.2014 17:10

Цитата:

Сообщение от GlaIZier
Есть best practice?

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

Сообщение от GlaIZier
var obj = Object(Class);

Эта строчка - неправильная. Потому что делает не то, что задумано. Инстанцированием тут и не пахнет:
var Class = {};
var instance = Object(Class); // то же, что и var instance = Class;

instance.foo = "bar";

alert(Class.foo);

Цитата:

Сообщение от GlaIZier
Кажется понял... Во втором случае используется замыкание и извне _args не видна.

Ну да, суть именно в этом.


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