хех.в вашем случае более простой паттерн сработает.
рассмотрим переменную за замыканием - очень трудно проколоть.это доступно через геттер и сеттер.
недостаток: значения данных не могут быть в экземпляре, или они могут быть доступны напрямую.
var testObj = (function() {
var data = {__proto__:null}; // 100% private
return new Class({
get: function(key) {
return data[this.uid][key] || null;
},
set: function(key, value) {
data[this.uid][key] = value;
},
remove: function(key) {
delete data[this.uid][key];
},
otherMethod: function() {
alert(this.get("foo"));
},
initialize: function() {
this.uid = String.uniqueID();
data[this.uid] = {};
}
});
})(); // why exec it?
var foo = new testObj();
var bar = new testObj();
foo.set("bar", "banana");
console.log(foo.get("bar")); // banana!
console.log(bar.get("bar")); // undefined.
bar.set("bar", "apple");
console.info(foo.get("bar"), bar.get("bar")); // banana apple
В действии: http://jsfiddle.net/dimitar/dCqR7/1/
Я изо всех сил пытаюсь найти способ проколоть этот шаблон вообще - что иногда достижимо путем прототипирования, подобного this .
на самом деле, я немного поиграл с ним, и вот фиксированный шаблон без пространства имен:
http://jsfiddle.net/dimitar/dCqR7/2/
var testObj = (function() {
var data = {__proto__:null}; // 100% private
return new Class({
get: function(key) {
return data[key] || null;
},
set: function(key, value) {
data[key] = value;
},
remove: function(key) {
delete data[key];
},
otherMethod: function() {
alert(this.get("foo"));
}
});
});
var foo = new new testObj();
var bar = new new testObj();
foo.set("bar", "banana");
console.log(foo.get("bar")); // banana!
console.log(bar.get("bar")); // undefined.
bar.set("bar", "apple");
console.info(foo.get("bar"), bar.get("bar")); // banana apple
edit почему это ...
Моя зависимость от MooTools означает, что мое понимание прототипов нативных js оставляет желать лучшего, поскольку оно абстрагирует вас от необходимости иметь дело с этим напрямую, но ..
в шаблоне одинВы определяете И запускаете функцию, которая создает прототип и устанавливает data
- единственный экземпляр.Затем вы создаете новые функции с этим «живым» прототипом, в котором уже установлено data
.
во втором шаблоне создается новый прототип, на который ссылаются для каждого экземпляра, независимо друг от друга.Ваша функция возвращает новую функцию с классом-прототипом ... так что на самом деле new Class({});
, следовательно, new new <var>()
создаст и создаст экземпляр класса.
, чтобы лучше это понять, возможно, вы можете сначала написать это так - обычнодостаточно шаблона для создания и создания экземпляра класса, который не используется повторно - что будет иметь больше смысла:
new (new Class({
initialize: function() {
alert("hi");
}
}))();
, который, в свою очередь, можно записать так (если он сохранен в переменной):
var foo = new Class({
initialize: function() {
alert("hi");
}
});
new foo();
Надеюсь, это имеет смысл, я не лучший человек, чтобы объяснять ...