JavaScript字符串子类化问题

时间:2013-06-03 16:22:28

标签: javascript string subclass

我正在开发一个简单的浏览器mud-client,我需要为字符串处理提供一些基本功能。因此,当某个用户施放一个质量咒语时,它应该被折叠为一个字符串,即CAST: User1 -> [target1, target2]。我写了代码:

function CastGroup(caster, cast, targets, text) {
    this.cast = cast || '';
    this.targets = targets || [];
    this.caster = caster || '';
    this.text = text || '';
}

CastGroup.prototype = new String;

CastGroup.prototype.render = function(){
    var targets = this.targets ? '[' + this.targets.join(', ') + ']' : '';
    var text = '<b>CAST</b>: ' + this.caster + ' ' + this.cast + ' -> ' + targets + '\n';
    this.text = text;

    return new CastGroup(this.caster, this.cast, this.targets, this.text);
};

CastGroup.prototype.valueOf = function(){
    return this.text;
};

CastGroup.prototype.toString = function(){
    return this.render();
};


var c = new CastGroup('name', 'supercast', ['1', '2']);
console.log(typeof c); // object
var s = c.replace('name', 'nomnom');
console.log(typeof s); // string

任何字符串函数,即String.replace()替换原始对象。我怎么能避免它?

EDIT1

我有一个后处理突出显示“引擎”,它调用用户的回调。用户应该认为,该捆绑包只有字符串。 bundle是一个包含原始文本,纯文本和彩色文本的数组。用户在用户空间中定义回调,应该执行所有突出显示工作。

function process_highlights(bundle){
    if (!bundle || !bundle.length){
        return bundle;
    }

    var highlight_result = bundle;
    for (var i=0; i<HIGHLIGHTS.length; i++){
        highlight_result = HIGHLIGHTS[i](highlight_result);
    }
    return highlight_result;
}

因此,文字流程链如下所示: original_bundle - &gt; subst_processor - &gt; trigger_processor - &gt; highlight_processor - &gt;的 output_window 即可。所有这些处理器都接受并返回一个包,应该包含字符串。我现在无法改变设计。

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你需要删除它:CastGroup.prototype = new String;

并执行此操作:CastGroup.prototype = String.prototype;

这将为您提供String方法,而不返回新的String对象。要了解有关此内容的更多信息(以及一般的高级Javascript),请查看these slides

更新

我想我现在明白了你的问题。 replace字符串方法返回一个新字符串,这就是它覆盖您的对象的原因。

您根本不需要继承String对象。 String方法甚至无法处理对象(因此请删除CastGroup.prototype = new String)。你想要做的只是直接修改对象的值。

如果您需要修改&#39;文字&#39;您的CastGroup的值,然后声明另一种方法:

CastGroup.prototype.modifyText = function (findValue, replaceValue) {
    var text = this.text;
    this.text = text.replace(findValue, replaceValue);
    return this;
};

答案 1 :(得分:0)

这对我有用。

CastGroup.prototype.replace = function() {
    this.text = this.text.replace.apply(this.text, arguments);
    return this;
};

覆盖对象中的原型,更新需要更新的字段,然后返回对象。