Oct 10 2008

4

Private Methods with Mootools update(2)

Category: Mutator

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

4 Responses to “Private Methods with Mootools update(2)”

  1. MooTools Class Mutators » Clientcide (Formerly CNET’s Clientside) says:

    [...] only other mutators that I’m aware of were authored by Nathan White that were designed to create Singletons and to help with the creation of private methods through [...]

  2. Sean McArthur says:

    Hey Nathan, very nice idea. But I noticed a slight bug. You use an inner function in the Mutator to achieve closure, and use this inside the inner function. Inner functions are bound to the Global object, so you assigned all the private variables to window. secret is available inside that function because it’s available everywhere!

    I wanted to use this Mutator, but when I discovered that, I had to write my own, based on your starting point and YUI’s module pattern. Most likely not optimized the best, but I welcome any comments and usage :)

  3. Private Variables Mutators for Class » Clientcide (Formerly CNET's Clientside) says:

    [...] while back Nathan White posted a Class Mutator for private variables that let you do this sort of [...]

  4. thomasd says:

    Hey Nathan, thank you for your work on the topic, it helped me a lot write my own solution to the problem. Check it out: http://thomasdullnig.blogspot.com/2009/01/private-members-in-mootools-i-do-it-my.html

Leave a Reply