Ошибка Uncaught типа пространства имен JavaScript - PullRequest
0 голосов
/ 12 сентября 2011

Я пытался улучшить свой код javascript, создав пространство имен для своего кода, чтобы не было глобальных переменных / столкновений функций, а также поместил все в пространство имен в анонимную функцию, чтобы все было приватно, если явно не указано иное. через заявление о возврате.
Atm, я получаю «Uncaught Type Error: объект не является функцией»

var Namespace = (function() {
    //private variables/functions
    var a;
    var b;
    function priv_func1() {
        //do stuff
    }

    //public variables/functions
    return {
        pub_var1: b,
        pub_func1: function() {
            //do stuff
        }
    };
})();

$(document).ready(function() {
    var myName = new Namespace();
    myName.pub_func1();
}

Поэтому, когда я удаляю () в конце определения Пространства имен, которое превращает объявление функции в выражение функции, я не получаю ошибки, но в примерах, которые я видел, там есть (), поэтому я мне интересно, что происходит.

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

if (!(this instanceof Namespace))
        return new Namespace();

РЕДАКТИРОВАТЬ: Кроме того, я должен поставить функцию готовности документа до или после определения пространства имен.

1 Ответ

2 голосов
/ 12 сентября 2011

Работает!Вам не нужно использовать new , потому что вы не определили constructor.

$(document).ready(function() {
   Namespace.pub_func1();
});

То, что вы пытались сделать, выполняется с помощью modules с помощью конструктора create.Позвольте мне показать вам пример из Javascript: Шаблоны проектирования

Модули, которые создают конструкторы

[..], но иногда удобнее создавать ваши объекты, используяфункции конструктора.Вы все еще можете сделать это, используя шаблон модуля.Единственное отличие состоит в том, что непосредственная функция, которая обертывает модуль, в конце возвращает функцию, а не объект.

Рассмотрим следующий пример шаблона модуля, который создает функцию конструктора

MYAPP.utilities.Array:
MYAPP.namespace('MYAPP.utilities.Array');
MYAPP.utilities.Array = (function () {
   // dependencies
   var uobj = MYAPP.utilities.object,
   ulang = MYAPP.utilities.lang,
   // private properties and methods...
   Constr;
   // end var
   // optionally one-time init procedures
   // ...
   // public API -- constructor
   Constr = function (o) {
      this.elements = this.toArray(o);
   };
   // public API -- prototype
   Constr.prototype = {
      constructor: MYAPP.utilities.Array,
      version: "2.0",
      toArray: function (obj) {
         for (var i = 0, a = [], len = obj.length; i < len; i += 1) {
            a[i] = obj[i];
         }
         return a;
      }
   };
   // return the constructor 
   // to be assigned to the new namespace
   return Constr;
}());

The way to use this new constructor will be like so:
var arr = new MYAPP.utilities.Array(obj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...