views:

1046

answers:

3

I'm developing a flash (Flash 9, AS3) to connect to a server and send/receive/parse data to a chat on JavaScript/HTML. I have a structure like this:

package {
    public class myClass {
     String.prototype.escapeHtml = function() {
      var str = this.replace(/&/g, "&");
      str = str.replace(/</g, "&lt;");
      str = str.replace(/>/g, "&gt;");
      return str;
     }

     function writeToBrowser(str:String) {
      ExternalInterface.call("textWrite",str.escapeHtml());
     }
    }
}

When I compile it, I get this error:

1061: Call to a possibly undefined method escapeHtml through a reference with static type String.

If I remove the :String, it all works fine, but then I'd have to check if str is a String and if it's not undefined and so on.

I have many functions like this on my code, many of them receive user-entered data, so I think that removing the :String and doing many checks on every function isn't the best approach.

How can I make this right?

+1  A: 

Prototype is actually legacy.

You should extend the String class and use your custom class

package {
    public class myClass {

        public function writeToBrowser(str:CustomString) {
                ExternalInterface.call("textWrite",str.escapeHtml());
        }
    }
    public class CustomString {

        public function escapeHtml():String {
                var str = this.replace(/&/g, "&amp;");
                str = str.replace(/</g, "&lt;");
                str = str.replace(/>/g, "&gt;");
                return str;
        }
    }
}
monkee
Thanks, that worked perfectly!
Mauricio
Actually, there's a problem. I can't actually extend the String class ("1016: Base class is final."), so I loose methods like split, replace, etc. and I need them.
Mauricio
+2  A: 

Then just define the function:

public function escapeHtml( str : String ) : String
{
    var str = this.replace(/&/g, "&amp;");
    str = str.replace(/</g, "&lt;");
    str = str.replace(/>/g, "&gt;");

    return str;
}

in your class.

And call it:

public function writeToBrowser( str : String )
{
    ExternalInterface.call( "textWrite", escapeHtml( str ) );
}

:)

monkee
That would solve the problem, but when you have function(function2(function3(str))) it's just ugly. Probably that's my bad coding.
Mauricio
+2  A: 

you get an error because the compiler is in strict mode. if you want to stay in strict mode you can try this:

ExternalInterface.call("textWrite",str["escapeHtml"]() );
OXMO456
That was actually it. I didn't remember I'd put it in strict mode.
Mauricio