我正在开发一个简单的浏览器泥客户端,我需要为字符串处理提供一些基本功能。所以,当一些用户施放一个集体法术时,它应该被折叠成一个字符串,即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()
替换原始对象。我怎样才能避免它?
编辑1
我有一个后处理突出显示“引擎”,它调用用户的回调。用户应该认为,该捆绑包只有字符串。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_processor
-> trigger_processor
-> highlight_processor
-> output_window
。所有这些处理器都接受并返回一个应该包含字符串的包。我现在无法更改设计。