I was also happy to receive a reply from Senocular indicating that there was not a simpler way just to override the _visible setter. He wrote:
AS3 supports native implementation overrides for getter/setters, but not AS1/AS2In the last post, I left off wondering whether I was willing to write a getter/setter for all the properties, methods and functions of my ubPod class.
I wrote two functions for MovieClipProxy.as to add additional properties and functions to a MovieClipProxy instance, namely addProp and addFunction:
public function addProp(propName:String){
var getterFunction:Function = function(){
return this._mc[arguments.callee.name];
}
getterFunction.name = propName;
var setterFunction:Function = function(newVal):Void{
this._mc[arguments.callee.name] = newVal;
}
setterFunction.name = propName;
this.addProperty(propName, getterFunction, setterFunction);
}
public function addFunction(propName:String){
this[propName] = function(a, b, c, d, e, f, g, h, i, j){
return this._mc[arguments.callee.name].call(arguments.callee.mcp_instance, a, b, c, d, e, f, g, h, i, j);
}
this[propName].name = propName;
this[propName].mcp_instance = this._mc;
//no luck getting getters and setters to work for functions
/*
var getterFunction:Function = function(){
trace("in mcp getter function with name "+arguments.callee["name"]+" from "+arguments.callee);
trace("addFunction getter");
return this._mc[arguments.callee.name];
}
getterFunction.name = propName;
var setterFunction:Function = function(f:Function){
trace("in mcp setter function with name "+arguments.callee["name"]+" from "+arguments.callee);
trace("addFunction setter");
//this._mc[arguments.callee.name] = newVal;
this._mc[arguments.callee.name] = function(a, b, c, d, e, f, g, h, i, j){return f.call(arguments.callee.mcp_instance, a, b, c, d, e, f, g, h, i, j)};
}
setterFunction.name = propName;
setterFunction.mcp_instance = this._mc;
this.addProperty(propName, getterFunction, setterFunction);
*/
}
which are invoked pretty simply with code like:
mcp.addProp("side");
mcp.addFunction("scale");
Next, I wondered if there was a way to get my ubPod class to reveal more of its properties and methods in a for..in loop. The new learning here relates to ASSetPropFlags (of which the compiler is unaware) which allowed me to write a function like:
_global["ASSetPropFlags"](ubPod.prototype,null,6,true);
for (var i in ubPod.prototype){
var thing = ubPod.prototype[i];
var typeThing:String = typeof(thing)
if (typeThing == "function" && i != "__constructor__"){
mcp.addFunction(i);
} else if (typeThing == 'number' || typeThing == 'string' || typeThing == 'boolean' || (typeThing == 'object' && i != "__proto__")){
mcp.addProp(i);
} else {
trace("did nothing for "+i);
}
}
Maybe some of this will help folks still in AS2 land. I am left still pretty foggy about __proto__, prototype, extends and casting.
Here are two challenges:
- Find the error in the code shared in the previous post.
- Modify my addFunction method to allow for a getter and setter as well as a function definition to be established.
No comments:
Post a Comment