Использование конструктора в статическом экземпляре JavaScript - PullRequest
1 голос
/ 27 сентября 2011

Я пишу библиотеку JavaScript, в которой я хочу, чтобы некоторые методы и свойства были общедоступными, а другие частными. Следующее кажется отличным способом сделать это, в то время как все упаковано в один объект.

(function (window) {
   var Thing = function() {
      // private var
      var variable = "value";

      return {
         // public method
         method:function() {
            alert(variable);
         }
      }
   }();

   window.Thing = Thing;

})(window);

Thing.method();

Что здорово. (В основном, от здесь ).

Однако я все же хотел бы иметь возможность использовать конструктор Thing для передачи некоторых аргументов.

В любом случае я могу предоставить конструктор в операторе возврата или использовать прототип для переопределения конструктора? Так что я могу позвонить:

Thing(stuff);

Прямо сейчас, если я попытаюсь это вызвать:

Uncaught TypeError: Property 'Thing' of object [object DOMWindow] is not a function

Это имеет смысл, поскольку оно не возвращает себя, но в идеале можно было бы вызвать конструктор.

ИЛИ, это просто baaaad, и я должен держаться подальше от некоторых или всего этого?

Ответы [ 3 ]

1 голос
/ 27 сентября 2011

Чтобы выполнить то, что вы просите, сделайте что-то вроде этого:

(function (window) {
   var thingMaker= function(stuff) {
      // private var
      var variable = "value";

      return {
         // public method
         method:function() {
            alert(variable);
         }
         alertStuff:function() {
            alert(stuff);
         }
      }
   };

   window.thingMaker= thingMaker;

})(window);

var myThing = window.thingMaker(stuff);
myThing.alertStuff()

Дополнительную информацию можно найти, выполнив поиск в Дугласе Крокфорде в googlenets.Некоторые замечательные и очень информативные его видео доступны на yui theatre .Но я должен был бы спросить, зачем создавать другой фреймворк, когда уже есть так много замечательных (jquery, prototype, yui, dojo и многие другие)

0 голосов
/ 27 сентября 2011

Thing - это Object с одним методом с именем method:

  {
     // public method
     method:function() {
        alert(variable);
     }
  }

Thing.method(); // alerts "value"

Вместо него можно вернуть:

function () {
    alert(arguments)
}

Тогда

Thing(6,5,4); // alerts 6,5,4
0 голосов
/ 27 сентября 2011

Thing уже создан, поэтому вы всегда будете слишком поздно вызывать «конструктор».

Вы можете передавать переменные следующим образом:

(function (window, var1, var2) {
  var Thing = function() {
  // private var
  var variable = "value";

  return {
     // public method
     method:function() {
        alert(variable);
     }
  }
}();
window.Thing = Thing;
})(window, var1, var2);
...