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 相关文章推荐
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
Mar 22 Javascript
仅用[]()+!等符号就足以实现几乎任意Javascript代码
Mar 01 Javascript
js DataSet数据源处理代码
Mar 29 Javascript
js null undefined 空区别说明
Jun 13 Javascript
Javascript简单改变表单元素背景的方法
Jul 15 Javascript
jQuery常用知识点总结以及平时封装常用函数
Feb 23 Javascript
jQuery 更改checkbox的状态,无效的解决方法
Jul 22 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
Oct 30 Javascript
前端跨域的几种解决方式总结(推荐)
Aug 16 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
Jul 23 jQuery
微信小程序自定义yPicker组件实现省市区三级联动功能
Oct 29 Javascript
一篇文章了解正则表达式的替换技巧
Feb 24 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
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
2013/07/19 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
getimagesize获取图片尺寸实例
2014/11/15 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
JavaScript 替换Html标签实现代码
2009/10/14 Javascript
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
javascript构造函数以及原型对象的理解
2017/01/13 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
python函数缺省值与引用学习笔记分享
2013/02/10 Python
python删除本地夹里重复文件的方法
2020/11/19 Python
python实现黑客字幕雨效果
2018/06/21 Python
python ftplib模块使用代码实例
2019/12/31 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
英文简历中的自荐信范文
2013/12/14 职场文书
小加工厂管理制度
2014/01/21 职场文书
初中三年毕业生的自我评价分享
2014/02/14 职场文书
周年庆典主持词
2014/04/02 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
小学生红领巾广播稿
2015/08/19 职场文书
周一给客户的问候语
2015/11/10 职场文书
2016党员党章学习心得体会
2016/01/14 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
如何自己动手写SQL执行引擎
2021/06/02 MySQL
Android存储中最基本的文件存储方式
2022/04/30 Java/Android