Абсолютно бессмысленный брат.Obj.apply(Obj);
делает то, что вы делаете, принимая функцию Obj и добавляя к ней эти методы, неинтуитивно.
Это:
var Obj = (function(){
var priv = function(){ console.log('2'); },
privVar = 6;
return {
pub1: function(){ console.log('1'); },
pub2: function(){ priv(); }
};
})();
Делает то же самое, хотялучше.Я говорю лучше, потому что (1) это интуитивно понятно, и (2) Obj
теперь является простым объектом javascript (typeof Obj === 'object'
), тогда как ваш Obj
является функцией с расширенными свойствами (typeof Obj === 'function'
).
Если вы хотите ссылку на self
, это не сложно (хотя это кажется ненужным), просто создайте объект, который будет возвращен в верхней части функции, и добавьте открытые методы в конец или по мере выполнения.они ...
Это безопасно, но бессмысленно.
Также обратите внимание, что эти методы не будут хорошо масштабироваться, потому что для каждого экземпляра Obj
мы создаем каждую функцию, которая воссоздается, чтос точки зрения памяти расточительно.Вышеприведенный шаблон хорош, потому что мы создали его с помощью анонимной функции, поэтому по определению может быть только один экземпляр, хотя для типов вам нужно создавать экземпляры несколько раз, следует использовать прототип.
Не пугайтесьздесь он может быть полезным.
ОБНОВЛЕНИЕ:
var Obj = (function(){
var priv = function(){ pub2(); },
privVar = 6,
pub1 = function(){ priv(); },
pub2 = function(){ console.log('1'); };
return {
pub1: pub1,
pub2: pub2
};
})();
Obj.pub1();
Обратите внимание, что я вызываю публичную функцию, которая вызывает приватную функцию, которая вызывает публичнуюфункция - без специальной привязки, без ссылки на объект.
ОБНОВЛЕНИЕ 2:
var Obj = (function(){
var public = {},
priv = function(){ public.pub2(); },
privVar = 6;
public.pub1 = function(){ priv(); },
public.pub2 = function(){ console.log('1'); };
return public;
})();
Obj.pub1();