Radagast the Brown
Radagast the Brown

Reputation: 3346

ActionScript3 - augmenting prototype of String

In AS2 I could do the following:

String.prototype.startsWith = function(s){
     return this.indexOf(s) == 1
}

thus, startsWith is available on every String object

var s = "some string to test with";
s.startsWith("some") // returns true

and did it with great repository of cool tools:

var s = "some @VAR string";
s.startsWith("some");//returns true
s.endsWith("ing");//returns true
s.contains("@");//returns true
s.dataBind({VAR: "awsome"})// returns 'some awsome string'
s = "b";
s.isAnyOf("a","b","c"); //true, because "b" is one of the options
s.isInArr(["a","b","c"]); //true, because "b" is in the passed array
var o = { foo: function(i) { return "wind " + i } }
s = "foo";
f.call(o,3) //returns "wind 3" because method foo is ivoked on o with 3
f.apply(o,[3]) //returns "wind 3" because method foo is ivoked on o with 3
var a1 = [], a2 = []
s.push(a1,a2) // pushes s into a1 and a2

And so on, and so forth with many cool things that makes coding much more fun (and blazing fast when smartly used)

It's not just about String, I have such utils for Number, Date, Boolean, and so on.

Here's what I tried:

[Test]
public function test_stringPrototype()
{
    String.prototype.startsWith = function(s):Boolean
    {
        return return this.indexOf(s) == 1;
    }

    assertTrue( !!String.prototype.startsWith ) //and so far - so good ! this line passes

    var s:String = "some str";
    assertTrue(!!o.startsWith ) //and this won't even compile... :(
}

And this won't even compile, not to mention pass or fail the test... error: Access of possibly undefined property startsWith through a reference with static type String.

Whats the way to do it in AS3?

Upvotes: 1

Views: 232

Answers (2)

you could always have the utility class that will collect all those methods and work on the string, e.g.

package utils
{
    public class StringUtils
    {
        public static function startsWith(input:String, test:String):Boolean
        {
            return input.indexOf(test) == 0;
        }
    }
}

usage:

trace(StringUtils.startWith("My string", "My"));

or as a "global" function:

package utils
{
    public function startsWith(input:String, test:String):Boolean
    {
        return input.indexOf(test) == 0;
    }
}

usage:

trace(startWith("My string", "My"));

best regards

Upvotes: 1

Ilya Zaytsev
Ilya Zaytsev

Reputation: 1055

Yes of course, use string representation of a variable name: "startsWith"; Example down

        String.prototype.traceME = function():void
        {
            trace(this);
        }

        var s:String = "some str";
        s["traceME"]();

else method:

            var s:Object = new String("some str");
            s.traceME();

Upvotes: 0

Related Questions