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 相关文章推荐
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
Jun 10 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
Dec 12 Javascript
js怎么终止程序return不行换jfslk
May 30 Javascript
javascript 表格内容排序 简单操作示例代码
Jan 03 Javascript
javascript 实现子父窗体互相传值的简单实例
Feb 17 Javascript
js控制href内容的连接内容的变化示例
Apr 30 Javascript
AngularJS的内置过滤器详解
May 14 Javascript
js+css实现回到顶部按钮(back to top)
Mar 02 Javascript
JS和JQuery实现雪花飘落效果
Nov 30 jQuery
微信小程序自定义轮播图
Nov 04 Javascript
vue+iview动态渲染表格详解
Mar 19 Javascript
javascript操作元素的常见方法小结
Nov 13 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中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
redis 队列操作的例子(php)
2012/04/12 PHP
54个提高PHP程序运行效率的方法
2015/07/19 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
PHP PDOStatement::fetchObject讲解
2019/02/01 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
javascript中的if语句使用介绍
2013/11/20 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
js对字符的验证方法汇总
2015/02/04 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
2015/03/03 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
微信小程序 template模板详解及实例
2017/02/21 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
jquery在启动页面时,自动加载数据的实例
2018/01/22 jQuery
如何将百度地图包装成Vue的组件的方法步骤
2019/02/12 Javascript
微信小程序 button样式设置为图片的方法
2020/06/19 Javascript
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
python基础教程之Filter使用方法
2017/01/17 Python
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
简单介绍django提供的加密算法
2019/12/18 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
教育实践活动对照检查材料
2014/09/23 职场文书
建筑专业毕业生求职信
2014/09/30 职场文书
离职报告格式
2014/11/04 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript
拙作再改《我的收音机情缘》
2022/04/05 无线电
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android
Python中tqdm的使用和例子
2022/09/23 Python