JavaScript字符串子类化问题

JavaScript String subclassing issue

本文关键字:问题 子类 字符串 JavaScript      更新时间:2023-09-26

我在一个简单的浏览器泥客户端工作,我需要提供一些基本功能的字符串处理。因此,当某些用户施放集体法术时,它应该被折叠成一个一个字符串,即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 h1> 有一个后处理高亮"引擎",它调用用户的回调。用户应该认为,那个bundle只有字符串。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 ->subst_processortrigger_processorhighlight_processor output_window 。所有这些处理器都接受并返回一个包,其中应该包含字符串。我现在不能更改设计

如果我正确理解了你的问题,你需要删除这个:CastGroup.prototype = new String; CastGroup.prototype = String.prototype;

这将为您提供String方法而不返回新的String对象。要了解更多关于这一点(以及一般的高级Javascript),请查看这些幻灯片。

更新:

我想我现在更明白你的问题了。replace string方法返回一个新字符串,这就是为什么它会覆盖你的对象。

您根本不需要从String对象继承。String方法甚至不能在对象上工作(所以删除CastGroup.prototype = new String)。你要做的就是直接修改对象的值。

如果你需要修改CastGroup的'text'值,那么声明另一个方法:

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

这对我很有效。

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

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