UPDATED
I updated my Privates Mutator yet again. Now, if you pass a function into the ‘Privates’ object a bind is created to the class.
Class.Mutators.Privates = function(self,privates){ self.initalize = (function(){ for(prop in privates) this[prop] = ($type(privates[prop]) == 'function') ? privates[prop].bind(self) : privates[prop]; return self.initialize; })(); }
I made a false assumption on how Mutators work within Mootools based on the following code snippet:
for (var mutator in Class.Mutators){ if (!this[mutator]) continue; Class.Mutators[mutator](this, this[mutator]); delete this[mutator]; }
I was expecting ‘delete this[mutator]‘ to destroy the ‘Privates’ object, it doesn’t!
The ‘delete’ Operator - from “Javascript: The Definitive Guide”
“delete” attempts to delete the object property, array element, or variable specified as its operand. It returns true if the deletion was successful, and false if the operand could not be deleted. If delete is invoked on a nonexistent property, it returns true. Surprisingly, the ECMAScript standard specifies that delete also evaluates to true if the operand is not a property, array element, or variable.
I assume what is happening is ‘this[mutator]‘ is an object property so it should be deleted. It doesn’t get deleted because it is a reference to an object. So the object must be destroyed. The only way to destroy an object in Javascript is to destroy all references to that object.
The following works:
Class.Mutators.Privates = function(self,privates){ self.initalize = (function(){ for(prop in privates) this[prop] = ($type(privates[prop]) == 'function') ? privates[prop].bind(self) : privates[prop]; return self.initialize; })(); delete self["Privates"]; for(prop in privates) delete self["Privates"][prop]; }
Some interesting things to note. Removing ‘delete self["Privates"]‘ fails to work even when this line is called just moments later in the Class Mutators code ( delete this[mutator] ). It must be called before the properties of the ‘Privates’ are deleted.
If I change the last 2 lines to the follow:
delete self["Privates"]; privates = null; for(prop in privates) delete self["Privates"][prop];
It doesn’t work. Nor does.
delete this['privates']; for(prop in privates) delete privates[prop];
If you have any addition insight into the delete operator or how to elegantly remove object references, please share.
Example:
var Secret = new Class({ Privates : { secret : 'hidden message', myFunc : function(){ return this.getSecret(); } }, getSecret : function(){ return secret; }, get : function(){ return myFunc(); } }); var msg = new Secret(); msg.get(); // returns "hidden message" msg.Privates.secret; // returns undefined