2014-10-15 1 views
0

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

var namespace = {}; 

namespace.parent = { 
    parent_method1 : function() {}, 
    parent_method2 : function() {} 
}; 


namespace.child = function (properties) { 

    var private="secret"; 

     this.prototype = { 
     create : function() { 
      this.unique = 'base'; 
      this.unique += this.properties; 
        return this.unique; 
     }, 
      get_private: function() { 
       console.log(private); 
      }, 
      set_private: function (val) { 
       private = val; 
      } 
     }; 


    var proto = Object.create(namespace.parent); 
    var instance = Object.create(proto); 
    for (var property in this.prototype) { 
      if (this.prototype.hasOwnProperty(property)) { 
       proto[property] = this.prototype[property]; 
      } 
    } 
     instance.properties = properties; 
    return instance; 
}; 

var a = namespace.child("a"); 
console.log(a.create()); 
a.get_private(); 
a.set_private("new_a_secret"); 
a.get_private(); 

var b = namespace.child("b"); 
console.log(b.create()); 
b.get_private(); 
a.get_private(); 

ответ

0

Я был бы признателен за помощь в указывая на недостатки/недостатки следующей реализации.

Я не вижу ничего плохого в вашей реализации var private, при условии, что он делает то, что вы ожидаете от него.

Однако большой недостаток кода: я не понимаю. Какова ваша реализация? Он не соответствует ни одному из стандартных шаблонов. Это может быть недостатком псевдо-методов и проясняться при реализации модели реального мира; однако, поскольку это стоит, это довольно запутывает. Некоторые комментарии к документации также помогут.

В частности:

  • Что namespace.child делать? Это похоже на заводскую функцию, но я не уверен, что это за «дети», которые она производит.
  • Кроме того, по какой-то причине это установить namespace.prototype свойство нового объекта на каждом вызове, который затем смешивают в instance объектаproto объекта. Однако он оставляет внутренности (get_private, set_private) последнего созданного экземпляра в глобальной области.
  • Действительно ли a и b должны быть классами? Почему у них есть методы .create(), которые инициализируют класс (экземпляр?) - и скорее следует называть .init(), если вообще? Почему они возвращают значение свойства .unique?
  • Почему метод child не инициализирует эти объекты сразу?
  • Что это такое .properties Поле, содержащее строковое значение?
  • Почему вы используете двухуровневое наследование для тех объектов instance? Object.create(namespace.parent) понятен, он наследует от статического объекта, который является общим. Но почему тогда Object.create(proto) используется, копирование некоторых свойств (create, get_private, set_private) на proto и некоторые свойства (properties, unique) на instance? Зачем различать их?
+0

Ну, тогда это не сработает, так как ни 'a', ни' b' не являются реальными. – Bergi

+0

namespace.child должен быть фабричной функцией, которая производит классы; init() - лучший способ называть функцию инициализации .unique был использован (confusingly?), чтобы показать, что они возвращают что-то уникальное на основе .properties. Сохранение строки - всего лишь пример. get_private, set_private и create (well init) должны быть разделены между каждым экземпляром класса (включая parent_method1 и parent_method2), есть ли лучший способ сделать их все разделяемыми с факторизуемыми классами, возможно, на одном уровне наследования, как вы предложили ? – humand

+0

Проблема в том, что 'create' (или' init') фактически инициализирует * сам класс *, а не создает * экземпляр класса *. Ваша терминология «*, разделяемая между каждым экземпляром класса *» является двусмысленной, вы имеете в виду объекты класса или объекты экземпляра? – Bergi

Смежные вопросы