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 相关文章推荐
用JS控制回车事件的代码
Feb 20 Javascript
五段实用的js高级技巧
Dec 20 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
May 08 Javascript
jQuery实现网页抖动的菜单抖动效果
Aug 07 Javascript
全面解析Bootstrap排版使用方法(文字样式)
Nov 30 Javascript
jQuery实现网页顶部固定导航效果代码
Dec 24 Javascript
Bootstrap精简教程中秋大放送
Sep 15 Javascript
深入解析js轮播插件核心代码的实现过程
Apr 14 Javascript
JS简单获取当前日期和农历日期的方法
Apr 17 Javascript
详解Vue.directive 自定义指令
Mar 27 Javascript
使用微信SDK自定义分享的方法
Jul 03 Javascript
vscode调试node.js的实现方法
Mar 22 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数组内存耗用太多问题的解决方法
2010/04/05 PHP
php目录操作函数之获取目录与文件的类型
2010/12/29 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
PHP实现根据数组的值进行分组的方法
2017/04/20 PHP
JavaScript 对象模型 执行模型
2009/12/06 Javascript
Javascript 实用小技巧
2010/04/07 Javascript
js以对象为索引的关联数组
2010/07/04 Javascript
基于jquery的表格排序
2010/09/11 Javascript
Javascript面向对象之四 继承
2011/02/08 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
jquery 遍历数组 each 方法详解
2016/05/25 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
2017/04/20 Javascript
Node.js系列之发起get/post请求(2)
2019/08/30 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
在Python中使用异步Socket编程性能测试
2014/06/25 Python
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
基于python历史天气采集的分析
2019/02/14 Python
python中安装django模块的方法
2020/03/12 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
html5 css3网站菜单实现代码
2013/12/23 HTML / CSS
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
离婚协议书范本2014
2014/10/27 职场文书
2015年七夕情人节感言
2015/08/03 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书
Python中requests做接口测试的方法
2021/05/30 Python
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript