Пространство имен JavaScript с использованием Singleton? Я в тупике! - PullRequest
3 голосов
/ 23 августа 2010

Это мой первый пост в StackOverflow. Это сообщество предоставило мне отличные идеи по многим вопросам кодирования за эти годы. Поэтому, поскольку я несколько дней застрял на этой конкретной задаче в JS, я решил опираться на это замечательное сообщество и посмотреть, какую помощь я могу получить по моему вопросу.

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

Вот что я пытаюсь сделать:

if (!myNamespace) {
  var myNamespace = {};
}

// Object for my namesapce
myNamespace.Item = function() { 
    return  {

        Initialize: function(title,details) {   
            // setting members of this Object
            this.title = title;   
            this.details = details;

        },

        Display: function() {
            this.Position();
            this.Show();    
        },

        Position: function() {
            // position my item in the DOM          
        },

        Show: function() {
            // show my item in the DOM          
        }
    };
}();    

// another Object for my namesapce
myNamespace.Basket = function()  {  
    return  {       
        Initialize: function(title,details,code) {  
            // setting members of this Object
            this.items = [];   
        },
        Add: function(item) {   
            this.items[items.length] = item;                
        }
    };
}();

var Item = new myNamespace.Item;  // the code fails to create a new instance of this Object
Item.Initialize("New Item Title","New Item Desc.");
Item.Display();

var Item2 = new myNamespace.Item;  // the code fails to create a new instance of this Object
Item2.Initialize("New Item Title2","New Item Desc. 2");
Item2.Display();

Я вполне уверен, что неправильно думаю о Синглтоне против Класса. Хороший пример кода с правильной вложенностью / структурой очень помог бы! СПАСИБО ЗА ПРЕДЕЛА!

Ответы [ 2 ]

2 голосов
/ 23 августа 2010

Проблема в том, что myNamespace.Item не является функцией, это объект, потому что у вас есть функция, которая выполняется немедленно.

Например, вы можете добавить методы к текущему объекту:

myNamespace.Item = function() { 
  this.initialize = function(title,details,code) {  
    // setting members of this Object
    this.title = title;   
    this.details = details;
    this.code = code;
  };

  this.display = function() {
    this.Position();
    this.Show();    
  };

  this.position = function() {
    // position my item in the DOM          
  };

  this.show = function() {
    // show my item in the DOM          
  }
};

Или используйте свойство prototype функции конструктора, чтобы экземпляры объектов, созданные с помощью оператора new, наследовали эти методы:

// Object for my namesapce
myNamespace.Item = function() {
  // constructor logic
};    

myNamespace.Item.prototype.initialize = function(title,details,code) {  
  // setting members of this Object
  this.title = title;   
  this.details = details;
  this.code = code;
};

myNamespace.Item.prototype.display = function() {
  this.Position();
  this.Show();    
};

myNamespace.Item.prototype.position = function() {
  // position my item in the DOM          
};

myNamespace.Item.prototype.show = function() {
  // show my item in the DOM          
};

Или немного более короткий синтаксис:

myNamespace.Item = function() { };

myNamespace.Item.prototype = {
  initialize: function(title,details,code) {  
    // setting members of this Object
    this.title = title;   
    this.details = details;
    this.code = code;
  },
  display: function() {
    this.Position();
    this.Show();    
  },
  position: function() {
    // position my item in the DOM          
  },
  show: function() {
    // show my item in the DOM          
  },
  constructor: myNamespace.Item // fix the constructor property
};

Преимущество использования свойства prototype состоит в том, что методы существуют только в объекте myNamespace.Item.prototype, в то время как в первом примере каждый объект будет иметь свои собственные экземпляры функций, которые менее эффективны для памяти.

1 голос
/ 23 августа 2010

Ваш код определяет литерал объекта и возвращает его, похоже.Это не то, что вы хотите.В определении конструктора просто присвойте свойства «this».Ключевое слово «new» будет гарантировать, что новый объект будет создан, установлен как «this» во время конструктора и возвращен вызовом.

if (!myNamespace) {
  var myNamespace = {};
}

myNamespace.Item = function() {
    this.x = 10;
};

var item = new myNamespace.Item();
alert(item.x);

Это обычный конструктор объекта в пространстве имен.Если вы хотите шаблон синглтона, попробуйте что-то вроде этого:

if (!myNamespace) {
  var myNamespace = {};
}

myNamespace.get = function() {
    if (typeof(this.singleton) === 'undefined') {
        var Item = function() {
            this.x = 10;
        };
        this.singleton = new Item();
    }
    return this.singleton;
}

var item = myNamespace.get();
alert(item.x);
...