2015-03-20 7 views
2

Я пытаюсь расширить класс String в ActionScript 3. Моя цель - автоматически добавлять теги вокруг строки.Не удается расширить прототип String?

Код:

String.prototype.addTags = function(t1:String, t2:String) : String { 
    return t1 + this + t2; 
} 

А затем вызвать функцию:

var str:String = "hello"; 
str.addTags("<b>", "</b>"); 


// expected output: <b>hello</b> 
trace(str); 

Это генерирует следующее сообщение об ошибке:

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

ответ

1

Я согласен с некоторыми другими ответами, которые считают эту «плохую идею». Однако, чтобы ответить на ваш вопрос, проблема с вашим исходным кодом заключается в том, что вы ничего не делали с возвращаемым значением addTags(). Это должно работать:

String.prototype.addTags = function(t1:String, t2:String):String { 
    return t1 + this + t2; 
} 

var str:String = "hello"; 
str = str.addTags("<b>", "</b>"); 

trace(str); // <b>hello</b> 

Хотя в «строгом режиме» вы получите ошибку компиляции на str.addTags() потому addTags() не известен способ String компилятором. Вы можете обойти эту проблему с помощью динамической ссылки или приведения к Object который является динамичным:

str = Object(str).addTags("<b>", "</b>"); 

Array класса уже динамичен, так вот почему вы не получите эту ошибку компиляции при использовании методов добавлены в массив опытный образец.

Опять же, я согласен с другими, что есть «лучшие» способы сделать это. (то есть способы, которые лучше подходят для языкового дизайна AS3.)

+0

Спасибо, четверть, наконец, упала .. :) (о разнице между классами Array и String). Я согласен, что это не лучшее решение, мне просто интересно, почему это не сработало. – Kokodoko

0

Это плохая идея. И вы не можете расширять примитивные типы. Лучше будет, если вы создадите утилиту класса, чтобы делать все, что хотите. Например:

package { 
    public class StringUtil { 
     public static function addTags(value:String, leftTag:String, rightTag:String):String { 
      return leftTag + value + rightTag; 
     } 
    } 
} 

P.S. Это просто пример. Существует множество способов реализовать то, что вы хотите.

+0

Спасибо, вот как я его реализую сейчас. Я всегда думал, что это возможно, поскольку есть много примеров того, как люди расширяют класс Array прототипом. Проверьте этот пример: http://www.benjaminkeen.com/arrayprototypeshuffle-as3/ – Kokodoko

+0

Массив не примитивный тип. Возможно, это причина, почему это возможно. – Crabar

+0

Я верю в ActionScript Строка не является примитивным типом данных, это класс, ссылочный тип и не может быть расширен, поскольку является окончательным. – gabriel

0

Если вы хотите сделать это с помощью «прототипа», вы можете вашу строку базовым типа (или номер, если вы хотите) к Object, как это:

Object.prototype.addTags = function(t1:String, t2:String):String { 
    return t1 + this + t2; 
} 

var str:String = 'hello'; 
    str = Object(str).addTags('<b>', '</b>'); 

trace(str);          // gives : <b>hello</b> 

trace(Object('world').addTags('<u>', '</u>')); // gives : <u>world</u> 

trace(Object(2015).addTags('<p>', '</p>'));  // gives : <p>2015</p> 

Надежда, которая может помочь.

Смежные вопросы