本来是想放在博客园首页的,貌似篇幅不够被移除掉了。后来慢慢补上,看这篇文章吧:一些优秀的代码分析与学习【持续更新】,里面的内容会持续更新,这篇文章作废了

1.jQuery初始化代码段

  技术亮点:jQuery无new化构建、每次jQuery构建的作用域隔离、jQuery拓展插件。

  实现源码:

var jQuery = function(args){
return new jQuery.fn.init(args);
}
jQuery.fn = jQuery.prototype = {
init: function(args){
return this;
},
otherFn: function(){}
}
jQuery.fn.init.prototype = jQuery.fn;

  分析:

  每次jQuery函数内部new的作用是隔离作用域。每次构建的都是一个新对象,新对象obj如果重写obj.__proto__下的属性不影响其他jQuery对象__proto__下的属性。

var m = jQuery(),n= jQuery();//m = {__proto__:{init:fn(),otherFn:fn()}};n = {__proto__:{init:fn(),otherFn:fn()}}
m.otherFn;//fn(){}
m.otherFn = "test";//m = {otherFn:"test",__proto__:{init:fn(),otherFn:fn()}};
n.otherFn;//fn(){}; n的结构n = {__proto__:{init:fn(),otherFn:fn()}}

  然后jQuery.fn提供jQuery对象的拓展,只要使用jQuery.fn.xx定义的属性在通过var m = jQuery();方式获取的对象m都可以通过m.xx获取到。如果直接使用jQuery.prototype来提供拓展给人感觉不太友好。

  上面的代码换成下面这种写法也是可以的

var jQuery = function(args){
return new jq(args);
}
function jq(args){
return this;
}
jQuery.fn = jq.prototype = {
otherFn: function(){};
}

  多出了一个函数变量jq,jQuery的这种写法只是减少了变量而已。

  关于new的详细点击这里

2.Sizzle引擎词法缓存机制

  技术亮点:一个函数实现存、取、缓存数据。

  实现源码:

function createCache() {
  var cache, keys = [];
  return (cache = function( key, value ) {
    // 使用 (key + " ")避免命名冲突,最大缓存createCache.cacheLength:50
    if ( keys.push( key += " " ) > createCache.cacheLength ) {
      // 去掉最老的记录
      delete cache[ keys.shift() ];
    }
    return (cache[ key ] = value);
  });
}
createCache.cacheLength = 50; //例子
var tokenCache = createCache();
//设置缓存
tokenCache("name", "chua");
//tokenize函数中获取缓存
cached = tokenCache[ "name" + " " ];//"chua"

  分析:

  局部变量cache使用函数表达式方式赋值,cache函数中给cache这个函数对象添加要缓存的属性。可以说是把函数对象运用到了极致。

3.jQuery判断js数据的具体类型

  技术亮点:call的妙用

  实现源码:

var class2type = {} ,
core_toString = class2type.toString; 
jQuery.type = function( obj ) {
if ( obj == null ) {
return String( obj );
}
return typeof obj === "object" || typeof obj === "function" ?
class2type[ core_toString.call(obj) ] || "object" :
typeof obj;
}
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});

  分析:

  首先我们知道toString()函数用于将当前对象以字符串的形式返回。该方法属于Object对象,由于所有的对象都"继承"了Object的对象实例,因此几乎所有的实例对象都可以使用该方法。而Object调用toString方法返回"[object ObjectName]",其中ObjectName是对象类型的名称。然后jQuery利用这一特性将准备检测的数据代入object的toString方法替换掉了其上下文环境为要检测的数据。

4.Dean Edwards的base2格式化函数

  技术亮点:arguments的灵活运用

  实现源码:

function format(string) {
var args = arguments;
var pattern = new RegExp('%([1-' + arguments.length + '])', 'g');
return String(string).replace(pattern, function(match, index,position,all) {
console.log(match + ' ' + index + ' ' + position + ' ' + all);
return args[index];
});
}; //实例
var name = "chua",
age = 20,
expr = "%1的年龄是%2";
format(expr,name,age);//"chua的年龄是20"
//控制台打印
//%1 1 0 %1的年龄是%2
//%2 2 6 %1的年龄是%2

  分析:这个比较简单就不分析了。主要就是arguments.length的运用。

  

  今天先到这里,明天继续。。。

  如果觉得本文不错,请点击右下方【推荐】!

一些很棒的js代码的更多相关文章

  1. 将一行很长的js代码格式化输出方便查看

    之前的一行js代码,有2万多字符,打开这个网址,粘贴到左边空白框,点下面格式化: 参考下面文章: 数千行的js代码变成了一行,如何复原,该换行的换行,该对齐的对齐_开发工具_小邯韩的博客-CSDN博客 ...

  2. 一行很好的JS代码

    [].forEach.call($$("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.rand ...

  3. 推荐一个很棒的JS绘图库Flot

    Flot是Ole Laursen开发的基于JQuery的纯JavaScript实现的绘图库,Flot使用起来非常简单,绘图效果相当绚丽,而且还支持一些图片的操作功能,例如图片的缩放.可以看一下Flot ...

  4. 很棒的jQuery代码片段分享

    jQuery实现的内链接平滑滚动 不需要使用太复杂的插件,只要使用下载这段代码即可实现基于内部链接的平滑滚动 $('a[href^="#"]').bind('click.smoot ...

  5. JS代码指导原则

    一.什么是平稳退化? 如果含有JS代码的网页在用户浏览器不支持JS(或者禁用JS)时,用户仍然能够顺利浏览(网站功能正常,只是视觉效果可能差一些),那么这个网页就能够平稳退化 网页能够平稳退化是很必要 ...

  6. js混淆加密,通过混淆Js代码让别人(很难)无法还原

    js混淆加密,通过混淆Js代码让别人(很难)无法还原   使用js的混淆加密,其目的是为了保护我们的前端代码逻辑,对应一些搞技术吃饭的公司来说,为了防止被竞争对手抓取或使用自己的代码,就会考虑如何加密 ...

  7. IOS学习资源收集--关于动画的代码学习资源总汇(很棒的动画效果哦)

    目录大纲: 1.很棒的iOS加载动画. github网址:https://github.com/NghiaTranUIT/FeSpinner 游老师的译文blog:http://www.cnblogs ...

  8. 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】

    原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...

  9. JS代码大全 (都是网上看到 自己整理的)

    事件源对象  event.srcElement.tagName  event.srcElement.type 捕获释放  event.srcElement.setCapture();   event. ...

随机推荐

  1. nmea协议

    NMEA协议 信息类型为: GPGSV:可见卫星信息 GPGLL:地理定位信息 GPRMC:推荐最小定位信息 GPVTG:地面速度信息 GPGGA:GPS定位信息 GPGSA:当前卫星信息 1. Gl ...

  2. Third Day(上班第四天):Android开发环境配置问题相关

    换公司新电脑了,重新安装Android开发环境,并配置,具体流程如下:1.百度JDK,访问Oracle官网:http://www.oracle.com/technetwork/java/javase/ ...

  3. 编译可在Nexus5上运行的CyanogenMod13.0 ROM(基于Android6.0)

    编译可在Nexus5上运行的CyanogenMod13.0 ROM (基于Android6.0) 作者:寻禹@阿里聚安全 前言 下文中无特殊说明时CM代表CyanogenMod的缩写. 下文中说的“设 ...

  4. Hybrid App移动应用开发初探

    一.移动App类型及其优缺点 1.1 Native App Native App(原生App)是用原生语言(Object-C/Java/C#/....)开发,用户需要下载安装的手机应用. 优点是 可以 ...

  5. 《HiWind企业快速开发框架实战》(2)使用HiWind创建自己的项目

    <HiWind企业快速开发框架实战>(2)使用HiWind创建自己的项目 关于HiWind HiWind企业快速开发框架,是基于.NET+EasyUi(支持各种前端扩展,后面将扩展Boot ...

  6. 关于大型网站技术演进的思考(二十)--网站静态化处理—web前端优化—中(12)

    Web前端很多优化原则都是从如何提升网络通讯效率的角度提出的,但是这些原则使用的时候还是有很多陷阱在里面,如果我们不能深入理解这些优化原则背后所隐藏的技术原理,很有可能掉进这些陷阱里,最终没有达到最佳 ...

  7. C++的性能C#的产能?! - .Net Native 系列向导

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  8. [ASP.NET MVC 小牛之路]14 - Unobtrusive Ajax

    Ajax (Asynchronous JavaScript and XML 的缩写),如我们所见,这个概念的重点已经不再是XML部分,而是 Asynchronous 部分,它是在后台从服务器请求数据的 ...

  9. Windows Azure Storage (19) 再谈Azure Block Blob和Page Blob

    <Windows Azure Platform 系列文章目录> 请读者在参考本文之前,预习相关背景知识:Windows Azure Storage (1) Windows Azure St ...

  10. ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法

    ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法 (2016-10-21 16:49:53)   今天在做一个查询的时候,报了一个"ORA-01652无法通过 ...