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 相关文章推荐
如何取得中文输入的真实长度?
Jun 24 Javascript
非常有用的40款jQuery 插件推荐(系列二)
Dec 25 Javascript
JavaScript中的this关键字介绍与使用实例
Jun 21 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
Sep 18 Javascript
jQuery实现按键盘方向键翻页特效
Mar 18 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
Apr 07 Javascript
BootStrap轻松实现微信页面开发代码分享
Oct 21 Javascript
微信小程序中显示html格式内容的方法
Apr 25 Javascript
vue.js获取数据库数据实例代码
May 26 Javascript
详解Angular的8个主要构造块
Jun 20 Javascript
es6在react中的应用代码解析
Nov 08 Javascript
js实现抽奖功能
Nov 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
PHP产生随机字符串函数
2006/12/06 PHP
PHP insert语法详解
2008/06/07 PHP
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
js window.event对象详尽解析
2009/02/17 Javascript
js 动态选中下拉框
2009/11/26 Javascript
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
2013/05/17 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
2019/03/16 jQuery
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
python opencv之SURF算法示例
2018/02/24 Python
python用插值法绘制平滑曲线
2021/02/19 Python
Python循环结构的应用场景详解
2019/07/11 Python
python3 反射的四种基本方法解析
2019/08/26 Python
pytorch构建多模型实例
2020/01/15 Python
CSS3实现10种Loading效果
2016/07/11 HTML / CSS
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
毕业生个人求职自荐信
2014/02/26 职场文书
网络营销计划书
2015/01/17 职场文书
毕业生个人自荐书
2015/03/05 职场文书
2015年社会治安综合治理工作总结
2015/04/10 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android