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 获取URL参数的插件
Mar 04 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
Oct 17 Javascript
JavaScript实现更改网页背景与字体颜色的方法
Feb 02 Javascript
javascript动态创建表格及添加数据实例详解
May 13 Javascript
javascript图片预加载实例分析
Jul 16 Javascript
浅析JavaScript声明变量
Dec 21 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
Feb 02 Javascript
localStorage的黑科技-js和css缓存机制
Feb 06 Javascript
微信小程序自定义轮播图
Nov 04 Javascript
微信小程序下拉框搜索功能的实现方法
Jul 31 Javascript
Vue 实现从小到大的横向滑动效果详解
Oct 16 Javascript
JavaScript cookie原理及使用实例
May 08 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中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
表单JS弹出填写提示效果代码
2011/04/16 Javascript
VBS通过WMI监视注册表变动的代码
2011/10/27 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
jquery 根据name名获取元素的value值
2015/02/27 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
原生JS简单实现ajax的方法示例
2016/11/29 Javascript
js实现图片加载淡入淡出效果
2017/04/07 Javascript
一次让你了解全部JavaScript的作用域
2019/06/24 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
djano一对一、多对多、分页实例代码
2019/08/16 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
python实现文件批量编码转换及注意事项
2019/10/14 Python
python动态规划算法实例详解
2020/11/22 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
中国文明网签名寄语
2014/01/18 职场文书
学生安全责任书
2014/04/15 职场文书
工伤事故处理协议书怎么写
2014/10/15 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
党员转正申请报告
2015/05/15 职场文书
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers