Obj.apply (Obj): это безопасно и эффективно? - PullRequest
1 голос
/ 31 марта 2011

Я придумал простой шаблон дизайна, который был вдохновлен несколькими другими шаблонами дизайна. Его основная цель - иметь закрытые методы (а не все глобальные), методы, визуально вложенные и сгруппированные в объекте, и имеющие «self» в качестве доступной переменной для доступа к области, что действительно полезно при использовании функций вызова с параметром callback .

Это , кажется, работает нормально, но безопасно ли (* - производительность и сфера применения) Obj.apply(Obj);?

код:

function Obj() {

    var self = this;

    var privateFunc = function() {
        console.log('private');
        self.otherPublic();
    };

    self.publicFunc = function() {
        console.log('pub1ic');
        privateFunc();
    };

    self.otherPublic = function() {
        console.log('pub2');
    };

} Obj.apply(Obj);

Я называю это так:

Obj.publicFunc();

1 Ответ

2 голосов
/ 31 марта 2011

Абсолютно бессмысленный брат.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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...