Проблема ActionScript с переменными прототипа и статического типа - PullRequest
2 голосов
/ 19 февраля 2009

Я разрабатываю флэш-память (Flash 9, AS3) для подключения к серверу и отправки / получения / анализа данных в чате на JavaScript / HTML. У меня есть такая структура:

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());
        }
    }
}

Когда я его компилирую, я получаю эту ошибку:

1061: вызов возможно неопределенного метод escapeHtml через ссылку со статическим типом String.

Если я уберу :String, все будет работать нормально, но тогда мне придется проверить, является ли str строкой, и не определено ли оно и т. Д.

У меня в коде много подобных функций, многие из них получают введенные пользователем данные, поэтому я думаю, что удаление :String и выполнение множества проверок для каждой функции не лучший подход.

Как я могу сделать это правильно?

Ответы [ 3 ]

2 голосов
/ 19 февраля 2009

Тогда просто определите функцию:

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

    return str;
}

в вашем классе.

И назовите это:

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

:)

2 голосов
/ 19 февраля 2009

вы получаете ошибку, потому что компилятор находится в строгом режиме. если вы хотите остаться в строгом режиме, вы можете попробовать это:

ExternalInterface.call("textWrite",str["escapeHtml"]() );
1 голос
/ 19 февраля 2009

Прототип на самом деле является наследием.

Вы должны расширить класс String и использовать свой собственный класс

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;
        }
    }
}
...