Как вы именуете объекты пространства в шаблоне раскрывающегося прототипа?

Я использую шаблон Revealing Module и имею несколько пространств имен. Пример:

// here's the namespace setup

var myProject= myProject|| {};
var myProject.models= myProject.models || {};

myProject.models.MyModel= function(){
   var someMethod = function(){
     // do something
   };
   return{
      SomeMethod = someMethod
   };
}

Я перехожу к Выявление шаблона прототипа, чтобы получить некоторые улучшения в использовании памяти, и чтобы я мог украсить объект другой функцией. Как сохранить его в пространстве имен myProject.models? Это дает мои ошибки JavaScript:

var myProject.models.MyModel= function(){
   // properties here
};

myProject.models.MyModel.prototype = (function(){
   // methods here
    var someMethod = function(){
         // do something
    };
    return{
       SomeMethod = someMethod
    };
}());

person AlignedDev    schedule 09.04.2013    source источник
comment
Удалите ключевое слово var! Вы присваиваете свойство, а не создаете переменную.   -  person Bergi    schedule 09.04.2013
comment
Итак, удаление var выполняется. Я смотрел на его пример и думал, что требуется var.   -  person AlignedDev    schedule 11.04.2013


Ответы (2)


У вас есть различные синтаксические ошибки.

myProject = window.myProject|| {};

myProject.models = myProject.models || {};

myProject.models.MyModel = (function () {
   //declare a constructor function
   function MyModel() {
   }

   //declare a function that will be publicly available on each MyModel instances
   MyModel.prototype.someFunction = function () {
       //call the private function from within the public one
       //note: you have to be careful here since the context object (this) will be
       //window inside somePrivateFunction
       somePrivateFunction();

       //call the private function and set the context object to the current model instance
       //somePrivateFunction.call(this);           
   };

   //declare a private function
   function somePrivateFunction() {
   }

   return MyModel; //return the model constructor
})();

Теперь вы можете использовать свою модель как:

var m = new myProject.models.MyModel();
m.someFunction();
person plalx    schedule 09.04.2013
comment
Моя цель - сделать var x = new myProject.models.MyModel() и передать некоторые значения, а затем вызвать x.SomeMethod(); - person AlignedDev; 09.04.2013

var myProject = myProject || {};
^^^

Вы используете var оператор для объявления глобального myProject переменная (если она еще не была создана), чтобы она не вызывала Undefined variable исключений. (Также вы инициализируете его пустым объектом, если он имеет значение)

var myProject.models= myProject.models || {};

Здесь вы назначаете свойство models объекту сверху. Ключевое слово var здесь неуместно; убери и все заработает.

С myProject.models.MyModel = … вы сделали это правильно в верхнем фрагменте и неправильно во втором; Я не уверен, что вы пытались использовать. Раскрывающий шаблон прототипа должен выглядеть так:

var myProject = myProject || {};
myProject.models = myProject.models || {};
myProject.models.MyModel = (function(){
    function MyModel() {
        // instance properties here
    }
    function someMethod(){
        // do something
    }
    MyModel.prototype.SomeMethod = someMethod;
    //                ^ lowercase that?
    return MyModel;
})();
person Bergi    schedule 09.04.2013
comment
функция-прототип должна быть внутри .MyModel (функция ()? из ссылки в моем вопросе, она была снаружи. Сейчас я начинаю смотреть на свойства, не могли бы вы, как выставить их с возвратом {}? - person AlignedDev; 09.04.2013
comment
Это не должно быть. Я предпочитаю не перезаписывать исходный объект-прототип (и сохранять, например, свойство .constructor), но вы также можете назначить ему литерал объекта. - person Bergi; 09.04.2013
comment
Интересный. Это ново для меня. Спасибо - person AlignedDev; 10.04.2013