Недостатки в следующей реализации частного состояния объектов экземпляра
Я читал, что частное состояние объектов экземпляров обычно не рекомендуется, и я был бы признателен за помощь в выявлении недостатков / недостатков следующей реализации. Любой совет / критика очень ценится.
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
? Почему различают их?