MEMon
20-09-2009, 17:44
Salve, stavo cercando come realizzare una classe in mootools con variabili e metodi privati e ho trovato dei "mutator" adatti allo scopo.
Sfortunatamente gli ho provati tutti ma nessuno sembra fare quello che affermano...
Probabilmente sbaglio io, quindi vi chiedo se gentilmente potete provare questi esempi e dirmi se funzionano davvero, cioč se realmente le variabili private non sono accessibili dall'esterno.
1)
Class.Mutators.Privates = function(self, privates) {
delete self['Privates'];
var oldInit = self.initialize;
self.initialize = function() {
var tempThis = $unlink(this);
var instPriv = $unlink(privates);
var instance = oldInit.apply(tempThis,arguments);
for(var prop in tempThis) {
if(instPriv.hasOwnProperty(prop)) {
instPriv[prop] = tempThis[prop];
} else {
this[prop] = tempThis[prop];
}
}
var that = this;
for(var key in tempThis) {
if($type(tempThis[key]) === 'function' && key !== 'initialize') {
(function (fn) {
var oldProp = that[key];
that[fn] = function() {
var my = $merge(that, instPriv);
var bound = oldProp.bind(my,arguments);
var returns = bound();
for(var prop in my) {
if(instPriv.hasOwnProperty(prop) && $type(instPriv[prop] !== 'function')) {
instPriv[prop] = my[prop];
} else {
that[prop] = my[prop];
}
}
return returns;
};
})(key);
}
}
return instance;
}
return self;
};
var Secret = new Class({
Implements: [Options, Events],
Privates: {
secret: 'shhhh'
},
open: null,
initialize: function(word) {
this.secret = word;
this.open = 'not a secret';
},
getSecret: function() {
return this.secret;
},
setSecret: function(newWord) {
this.secret = newWord;
this.notSecret = 'im a new prop in this';
},
getOpen: function() {
return this.open;
}
});
var test = new Secret('this a secret test');
test.open
test.secret //mi risulta accessibile ma non dovrebbe...
2)
Class.Mutators.Privates = function(self,properties){
var priv = {};
$splat(properties).each(function(property){
priv[property] = self[property];
});
self.initalize = (function(){
for(prop in priv){ this[prop] = priv[prop]; self[prop] = undefined; }
return self.initialize;
})();
}
var Secret = new Class({
Privates : ['secret'],
secret : 'hidden message',
getSecret : function(){
return secret;
}
});
var msg = new Secret();
msg.getSecret(); // returns "hidden message" <- errore, secret non č definito
msg.secret; // returns undefined <- a me risulta accessibile...
ok intanto questi...
Non ho mai usato mootools(e nemmo ho intenzione di farlo), ma sono curioso di vedere il risultato di qusto framework.
Sfortunatamente gli ho provati tutti ma nessuno sembra fare quello che affermano...
Probabilmente sbaglio io, quindi vi chiedo se gentilmente potete provare questi esempi e dirmi se funzionano davvero, cioč se realmente le variabili private non sono accessibili dall'esterno.
1)
Class.Mutators.Privates = function(self, privates) {
delete self['Privates'];
var oldInit = self.initialize;
self.initialize = function() {
var tempThis = $unlink(this);
var instPriv = $unlink(privates);
var instance = oldInit.apply(tempThis,arguments);
for(var prop in tempThis) {
if(instPriv.hasOwnProperty(prop)) {
instPriv[prop] = tempThis[prop];
} else {
this[prop] = tempThis[prop];
}
}
var that = this;
for(var key in tempThis) {
if($type(tempThis[key]) === 'function' && key !== 'initialize') {
(function (fn) {
var oldProp = that[key];
that[fn] = function() {
var my = $merge(that, instPriv);
var bound = oldProp.bind(my,arguments);
var returns = bound();
for(var prop in my) {
if(instPriv.hasOwnProperty(prop) && $type(instPriv[prop] !== 'function')) {
instPriv[prop] = my[prop];
} else {
that[prop] = my[prop];
}
}
return returns;
};
})(key);
}
}
return instance;
}
return self;
};
var Secret = new Class({
Implements: [Options, Events],
Privates: {
secret: 'shhhh'
},
open: null,
initialize: function(word) {
this.secret = word;
this.open = 'not a secret';
},
getSecret: function() {
return this.secret;
},
setSecret: function(newWord) {
this.secret = newWord;
this.notSecret = 'im a new prop in this';
},
getOpen: function() {
return this.open;
}
});
var test = new Secret('this a secret test');
test.open
test.secret //mi risulta accessibile ma non dovrebbe...
2)
Class.Mutators.Privates = function(self,properties){
var priv = {};
$splat(properties).each(function(property){
priv[property] = self[property];
});
self.initalize = (function(){
for(prop in priv){ this[prop] = priv[prop]; self[prop] = undefined; }
return self.initialize;
})();
}
var Secret = new Class({
Privates : ['secret'],
secret : 'hidden message',
getSecret : function(){
return secret;
}
});
var msg = new Secret();
msg.getSecret(); // returns "hidden message" <- errore, secret non č definito
msg.secret; // returns undefined <- a me risulta accessibile...
ok intanto questi...
Non ho mai usato mootools(e nemmo ho intenzione di farlo), ma sono curioso di vedere il risultato di qusto framework.