2013-04-09 3 views
2

Я использую шаблон раскрывающегося модуля и имею несколько пространств имен. Пример:Как вы размещаете объекты пространства в раскрывающемся шаблоне прототипа?

// 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 
    }; 
} 

Я переезжаю к Revealing Prototype Pattern, чтобы получить некоторые улучшения использования памяти и поэтому я могу украсить объект другую функцию. Как сохранить его в пространстве имен 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 
    }; 
}()); 
+0

Удалите ключевое слово 'var'! Вы назначаете свойство, а не создаете переменную. – Bergi

+0

Хорошо, поэтому удаление var выполняется. Я смотрел на его пример и думал, что вар нужен. – Aligned

ответ

4

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

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(); 
+0

Моя цель - сделать var x = new myProject.models.MyModel() и передать некоторые значения, а затем вызвать x.SomeMethod(); – Aligned

+0

@Aligned, учитывая ваши комментарии, я обновил свое сообщение. – plalx

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

Вы используете var statement здесь, чтобы объявить глобальную переменную 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; 
})(); 
+0

функция прототипа должна находиться внутри .MyModel (function()? Из ссылки в моем вопросе, он у меня был снаружи. Теперь я начинаю искать свойства, не могли бы вы разоблачить те, у кого есть return {}? – Aligned

+0

Это не обязательно. Я предпочитаю не перезаписывать оригинальный объект-прототип (и, например, сохранить свойство '.constructor'), но вы также можете назначить ему литерал объекта. – Bergi

+0

Интересно. Это ново для меня. – Aligned