Prototype源码浅析 String部分(四)之补充


Posted in Javascript onJanuary 16, 2012
替换 interpolate  | sub |  scan |  truncate | gsub
interpolate : 将字符串看作一个模板,并使用 object 的属性填充它。
sub : 将字符串中前指定个个与 pattern 指定的模式匹配的子串用 replacement 替换
scan : 遍历字符串中与参数 pattern 指定的模式匹配的所有子串。返回原始字符串本身。
truncate : 将字符串截短为指定的长度(包含后缀部分), 并添加一个后缀。
gsub :将字符串中所有与 pattern 指定的模式匹配的值全部用 replacement 替换掉

上面的方法中,最重要的一个方法是gsub,具体说明参见《浅析Prototype的模板类--Template》
sub除了可以限定次数外,其他与gsub完全一致。

function sub(pattern, replacement, count) { 
replacement = prepareReplacement(replacement); 
count = Object.isUndefined(count) ? 1 : count; 
return this.gsub(pattern, function(match) { 
if (--count < 0) return match[0]; 
return replacement(match); 
}); 
}

scan也是一样的,不过scan最后返回的是字符串本身而已。
interpolate 是将字符串当做模板来用,核心还是gsub
truncate 是唯一有点区别的(我现在依稀感觉我分错类了)。
以字符串'fuck the gfw'为例,truncate 的执行'fuck the gfw'.truncate(10,'****')的步骤是:
1、获得前面10 - '****'.length个字符 'fuck t'
2、拼上后缀'****',得到 'fuck t****',长度为10.
处理很简单,源码也简单:
function truncate(length, truncation) { 
length = length || 30;//默认长度30 
truncation = Object.isUndefined(truncation) ? '...' : truncation;//默认后缀... 
return this.length > length ? 
this.slice(0, length - truncation.length) + truncation : String(this); 
}

另:Prototype的一个方便之处就是随时可以抽取有用的代码作为单独的部分或者收为自己用。下面是单独提出来的模板方法。

function Template(template, pattern){ 
this.template = template; 
this.pattern = pattern || /(^|.|\r|\n)(#\{(.*?)\})/; 
} 
Template.prototype = (function(){ 
function evaluate(obj){ 
return gsub.call(this,function(match){ 
if(obj == null){ 
return match[0] + ''; 
} 
var before = match[1] || ''; 
if(before == '\\'){ 
return match[2]; 
} 
var ctx = obj; 
var expr = match[3]; 
var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; 
match = pattern.exec(expr); 
if (match == null){ 
return before; 
} 
while (match != null) { 
var comp = match[1].search(/^\[/) != -1 ? match[2].replace(/\\\\]/g, ']') : match[1]; 
ctx = ctx[comp]; 
if (null == ctx || '' == match[3]) break; 
expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); 
match = pattern.exec(expr); 
} 
return before + (ctx === null ? '' : String(ctx)); 
}); 
} 
function gsub(replacement){ 
var pattern = this.pattern; 
var result = ''; 
var match = null; 
var source = this.template; 
if (!(pattern.length || pattern.source)) { 
replacement = replacement(''); 
return replacement + source.split('').join(replacement) + replacement; 
} 
while (source.length > 0) { 
if (match = source.match(pattern)) { 
result += source.slice(0, match.index); 
result += replacement(match) === null ? '' : String(replacement(match)); 
source = source.slice(match.index + match[0].length); 
}else { 
result += source; 
source = ''; 
} 
} 
return result; 
} 
return { 
constructor : Template, 
evaluate : evaluate 
} 
})();

var template = new Template('my age is : #{name.age}'); 
console.log(template.evaluate({name : {age : 24}}));//my age is : 24

String部分(完)
Javascript 相关文章推荐
flash javascript之间的通讯方法小结
Dec 20 Javascript
JavaScript 替换Html标签实现代码
Oct 14 Javascript
js弹出层(jQuery插件形式附带reLoad功能)
Apr 12 Javascript
原生javascript兼容性测试实例
Jul 01 Javascript
文本框只能选择数据到文本框禁止手动输入
Nov 22 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
Jul 12 Javascript
详解JS-- 浮点数运算处理
Nov 28 Javascript
Js中使用正则表达式验证输入是否有特殊字符
Sep 07 Javascript
javascript for循环性能测试示例
Aug 07 Javascript
微信小程序登录时如何获取input框中的内容
Dec 04 Javascript
原生JS实现天气预报
Jun 16 Javascript
Javascript之datagrid查询详解
Sep 15 Javascript
Prototype源码浅析 String部分(二)
Jan 16 #Javascript
深入理解JavaScript系列(11) 执行上下文(Execution Contexts)
Jan 15 #Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
Jan 15 #Javascript
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
Jan 15 #Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
Jan 15 #Javascript
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
Jan 15 #Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
Jan 15 #Javascript
You might like
php中将地址生成迅雷快车旋风链接的代码[测试通过]
2011/04/20 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
Yii获取当前url和域名的方法
2015/06/08 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
prototype class详解
2006/09/07 Javascript
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
Jquery插件之多图片异步上传
2010/10/20 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
2013/12/14 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
javascript弹出窗口实现代码
2015/11/12 Javascript
javascript产生随机数方法汇总
2016/01/25 Javascript
Javascript 调用 ActionScript 的简单方法
2016/09/22 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
2017/05/09 Javascript
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
2017/09/18 jQuery
Vue项目报错:Uncaught SyntaxError: Unexpected token
2018/11/10 Javascript
JS+CSS实现炫酷光感效果
2020/09/05 Javascript
原生小程序封装跑马灯效果
2020/10/21 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
python 图片二值化处理(处理后为纯黑白的图片)
2019/11/01 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
python调用win32接口进行截图的示例
2020/11/11 Python
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
一套软件测试笔试题
2014/07/25 面试题
传播学专业毕业生自荐书
2014/07/01 职场文书
交通安全教育主题班会
2015/08/12 职场文书
2016年社区综治宣传月活动总结
2016/03/16 职场文书
青年人初次创业的“五不要”
2019/08/23 职场文书
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL