Недостатки в следующей реализации частного состояния объектов экземпляра

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

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

1 ответ

Решение

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

Я не вижу ничего плохого в вашей реализации 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? Почему различают их?
Другие вопросы по тегам