Search code examples
actionscript-3

Are classes methods created individually for instances?


I want to know whether in ActionScript 3 there's a way to share a same function (method) between the instances of a class definition, only referencing the same function everytime... i.e., this example should log true, but logged false (note: I'd want this to reduce duplicating functions).

class A {
    function f() {}
}

trace(
    (new A).f === (new A).f
)

An ActionScript 3 language specification appears to say that a prototype attribute exists, but not implemented. I've understood that individual classes have a prototype object. I've specially found a prototype property (probably inherited from Class/Object) and wonder if classes use meta functions in order to be constructed (since their type is "object"... when I test with typeof: trace(typeof A, typeof Class, typeof Object)).

My last try:

class A {}

A.prototype.f = function() {}

trace(
      (new A).f === (new A).f
)

It says that f doesn't exist. I could define this class as a function instead (in order to move methods to the prototype object):

function A() {}

A.prototype.f = function() {}

, but in this way I can't control access of instance members.


Solution

  • AS3 uses Bound methods to ensure that inside your functions, this always points to original instance object by default.

    Imagine that you pass a function f of an instance a to some other object b. When then object b calls function f, the this name still points to a inside scope of the function - this reference has to be store somewhere.

    Well, you could assign function to static property of your class:

    package adnss.projects.evTest 
    {
    
        public class A {
    
            private var x:Number = 5;
            private var _y:Number = 0;
    
            public function A(){}
    
            static public const f = function (p:Number):Number {
                this._y = p;
                return this.x*p;        
            }
    
            public function get y():Number { return _y; }
        }
    }
    

    And then have access to private properties of the instance of A in that static function by explicitly using this:

    var instance:A = new A();
    trace("return:", A.f.call(instance, 3)); //return: 15
    trace("instace:", instance.y); //instance: 3
    

    But that is kind of tricky for possible benefits (if any).

    And about prototypes. You basically don't use them in AS3. Is't there like a souvenir :) - read this for more info