无法扩展String原型?

时间:2015-03-20 13:58:36

标签: actionscript-3

我正在尝试在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:通过带有静态类型String的引用调用可能未定义的方法addTags。

3 个答案:

答案 0 :(得分: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语言设计的方法。)

答案 1 :(得分:0)

这是一个坏主意。而且你不能扩展原始类型。如果你创建类实用程序来做任何你想做的事情会更好。例如:

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

P.S。这只是一个例子。有许多不同的方法可以实现您想要的。

答案 2 :(得分:0)

如果你想使用&#34; prototype&#34;来做到这一点,你可以将你的字符串(或数字,如果你想要的话)翻译成这样的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>

希望可以提供帮助。