Add methods to native Classes in ActionScript 3.0 – Prototype functions
Hi again!
Yesterday I’ve found out a cool new feature of ActionScript 3.0. You will sometimes have to use associative Arrays. The problem with these is that you can’t easily loop through them with a for-loop like
-
var myAssocArray:Array = [],
-
i :int,
-
intLength :int;
-
-
myAssocArray['foo'] = 'one';
-
myAssocArray[1] = 'two';
-
myAssocArray['bar'] = 'three';
-
myAssocArray[0] = 'four';
-
intLength = myAssocArray.length;
-
-
for(; i< intLength; ++i)
-
{
-
trace(myAssocArray[i]);
-
}
The trace will probably print out “four, two, undefined, undefined”. The fact is that you can get the elements 0 & 1 via the variable i, but the the other keys can’t be accessed with this method.
As I also like PHP very much, I also know the function array_keys(array) of PHP, which returns the key-values of the array given in the parameters. I thought that I really need this functionality within AS3, so I tried a lot, searched the internet and finally got it! It’s pretty simple for those knowing AS2 – prototype functions.
What do we need to do? Place the following code in your main, unnamed package below or above the class-definition and you can use it everywhere else in the code:
-
package
-
{
-
public class foo
-
{
-
public function foo():void
-
{
-
trace('bar');
-
}
-
}
-
-
Array.prototype.arrayKeys = function():Array
-
{
-
var arrReturn :Array = [],
-
strKey :String;
-
-
for(strKey in this)
-
{
-
if(typeof this[strKey] == 'function') continue;
-
trace('in Array:: value->'+ strKey +' typeOf:'+ typeof strKey +' proto:'+ ((this[strKey] !== false) ? typeof this[strKey] : 'NULL'));
-
arrReturn[arrReturn.length] = strKey;
-
}
-
-
return arrReturn;
-
}
-
-
Number.prototype.give = function():String
-
{
-
return 'Number::giveItToMeBaby';
-
}
-
}
You can now use this method to get the keys of the variable:
-
var arrKeys :Array = myAssocArray.arrayKeys(),
-
i :int,
-
intLength :int = arrKeys.length;
-
-
for(; i < intLength; ++i)
-
{
-
trace(myAssocArray[arrKeys[i]]);
-
}
Pretty easy, isn't it? Well, it is easy because the native Array-Class is dynamic, but what do we do with Number (final class)? Let's see...
-
var num:Number = 4;
-
num.give(); //doesn't work! final class, can't add methods to it?
-
-
num['give'](); //does work
you can dynamically add methods to a class even if it's final; problem is that this code is hard to read, but it actually works
So far...
Daniel
























Daniel Bunte wrotes
am 12. August 2009 @ 16:14
Please note:
The problem with Array-Prototype-Methods is that if you run through that array with
for(var strKey:* in arrObjects)
{
trace(strKey);
}
you will probably also get the function as a methdod.
So the trace will will put “function() Function” or something similar on the screen.