通过jQuery源码学习javascript(二)


Posted in Javascript onDecember 27, 2012

巧妙1:函数

在javascript代码中函数是个不可多得的人才。

♥ 它可以归置代码段,封装相对独立的功能。

♥ 它也可以实现类,注入OOP思想。

jQuery就是一个函数,你也可以把它当成类(呵呵,本身就是类)。

(function(){ 
var jQuery = function() { 
// 函数体 
} 
window.jQuery = window.$ = jQuery; 
})(); 
console.log(jQuery);

通过jQuery源码学习javascript(二)
上面的空函数就是所谓的构造函数,构造函数在面向对象语言中是类的一个基本方法。

巧妙2:扩展原型

何为原型对象?我给出一篇博文大家可以去了解一下https://3water.com/article/32857.htm。

javascript为所有函数绑定一个prototype属性,由这个属性指向一个原型对象。我们在原型对象中定义类的继承属性和方法等。

原型对象是javascript实现继承的基本机制。

(function(){ 
var jQuery = function() { 
// 函数体 
} 
jQuery.fn = jQuery.prototype = { 
// 扩展原型对象 
jquery: "1.8.3", 
test: function() { 
console.log('test'); 
} 
} 
window.jQuery = window.$ = jQuery; 
})(); (new jQuery()).test();

巧妙3:使用工厂方法来创建一个实例

上面的方法必须使用下面的方法才能进行调用,这样就会产生很多对象,从而浪费内存消耗。

(new jQuery()).test();

jQuery源码使用了很柔和的方法,也是大家比较熟悉的工厂方法,进行调用。

(function(){ 
var jQuery = function() { 
// 函数体 
return jQuery.fn.init(); 
} 
jQuery.fn = jQuery.prototype = { 
// 扩展原型对象 
jquery: "1.8.3", 
init: function() { 
return this; 
}, 
test: function() { 
console.log('test'); 
} 
} 
window.jQuery = window.$ = jQuery; 
})(); 
jQuery().test();

通过jQuery源码学习javascript(二)

假想1:让jQuery函数体直接返回该对象——我用this
(function(){ 
var jQuery = function() { 
return this; 
} 
jQuery.fn = jQuery.prototype = { 
// 扩展原型对象 
jquery: "1.8.3", 
test: function() { 
console.log('test'); 
} 
} 
window.jQuery = window.$ = jQuery; 
})(); 
console.log(jQuery());

输出结果

通过jQuery源码学习javascript(二)

发现这里的this指向Window对象。


假想2:让jQuery函数体直接返回类的实例。

(function(){ 
var jQuery = function() { 
return new jQuery(); 
} 
jQuery.fn = jQuery.prototype = { 
// 扩展原型对象 
jquery: "1.8.3", 
test: function() { 
console.log('test'); 
} 
} 
window.jQuery = window.$ = jQuery; 
})(); 
console.log(jQuery());

输出结果

通过jQuery源码学习javascript(二)

发现上面是一个递归死循环,出现内存外溢。

巧妙4:分隔作用域

思考1:init()方法返回的this作用域是什么?

(function(){ 
var jQuery = function() { 
// 函数体 
return jQuery.fn.init(); 
} 
jQuery.fn = jQuery.prototype = { 
// 扩展原型对象 
jquery: "1.8.3", 
init: function() { 
this.init_jquery = '2.0'; 
return this; 
} 
} 
window.jQuery = window.$ = jQuery; 
})(); 
console.log(jQuery().jquery); 
console.log(jQuery().init_jquery);

输出结果
通过jQuery源码学习javascript(二)

init()方法中的this作用域:this关键字引用了init()函数作用域所在的对象,同时也能够访问上一级对象jQuery.fn对象的作用。——这种思路会破坏作用域的独立性,对于jQuery框架来说,很可能造成消极影响。

思考2:怎么把init()中的this从jQuery.fn对象中分隔出来?——实例化init初始化类型。

(function(){ 
var jQuery = function() { 
// 函数体 
return new jQuery.fn.init(); 
} 
jQuery.fn = jQuery.prototype = { 
// 扩展原型对象 
jquery: "1.8.3", 
init: function() { 
this.init_jquery = '2.0'; 
return this; 
} 
} 
window.jQuery = window.$ = jQuery; 
})(); 
console.log(jQuery().jquery); 
console.log(jQuery().init_jquery);

输出结果
通过jQuery源码学习javascript(二)
通过实例化init()初始化类型,限定了init()方法里的this,只在init()函数内活动,不让它超出范围。

巧妙5:原型传递

思考1:在巧妙4中,我们把init()中的this从jquery.fn对象中分隔出来。那我们如何能做到保证“巧妙4”的基础上,还能访问jQuery原型对象呢?——原型传递。

让jQuery的原型对象覆盖init()构造器的原型对象。

jQuery.fn.init.prototype = jQuery.fn;

全部代码:
(function(){ 
var jQuery = function() { 
// 函数体 
return new jQuery.fn.init(); 
} 
jQuery.fn = jQuery.prototype = { 
// 扩展原型对象 
jquery: "1.8.3", 
init: function() { 
this.init_jquery = '2.0'; 
return this; 
} 
} 
jQuery.fn.init.prototype = jQuery.fn; 
window.jQuery = window.$ = jQuery; 
})(); 
console.log(jQuery().jquery); 
console.log(jQuery().init_jquery);

输出结果

通过jQuery源码学习javascript(二)

妙棋

把init()对象的prototype指针指向jQuery.fn。——这样init()里的this继承了jQuery.fn原型对象定义的方法和属性。

总结

感谢博友的留言,尤其是puni ,给我介绍了一本不错的书。如果大家能补充一下,那就再好不过了。

Javascript 相关文章推荐
JQuery 常用方法基础教程
Feb 06 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
Nov 19 Javascript
两个listbox实现选项的添加删除和搜索
Mar 01 Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
Apr 15 Javascript
js格式化输入框内金额、银行卡号
Feb 01 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
May 02 Javascript
js 取消页面可以选中文字的功能方法
Jan 02 Javascript
移动web开发之touch事件实例详解
Jan 17 Javascript
jQuery中可见性过滤器简单用法示例
Mar 31 jQuery
vue 移动端注入骨架屏的配置方法
Jun 25 Javascript
jquery实现下载图片功能
Jul 18 jQuery
JavaScript 空间坐标的使用
Aug 19 Javascript
js 判断一个元素是否在页面中存在
Dec 27 #Javascript
通过jQuery源码学习javascript(一)
Dec 27 #Javascript
Eval and new funciton not the same thing
Dec 27 #Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
Dec 27 #Javascript
JS 添加网页桌面快捷方式的代码详细整理
Dec 27 #Javascript
JavaScript初学者应注意的七个细节详细介绍
Dec 27 #Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
Dec 27 #Javascript
You might like
php sprintf()函数让你的sql操作更安全
2008/07/23 PHP
基于simple_html_dom的使用小结
2013/07/01 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
2013/11/13 Javascript
JavaScript实现多维数组的方法
2013/11/20 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
Python正则抓取新闻标题和链接的方法示例
2017/04/24 Python
pyqt5的QComboBox 使用模板的具体方法
2018/09/06 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
如何基于Python获取图片的物理尺寸
2019/11/25 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
django使用channels实现通信的示例
2020/10/19 Python
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
将n个数按输入顺序的逆序排列,用函数实现
2012/11/14 面试题
高中生家长会演讲稿
2014/01/14 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
需求分析说明书
2014/05/09 职场文书
我为党旗添光彩演讲稿
2014/09/13 职场文书
个人务虚会发言材料
2014/10/20 职场文书
房产证明范本
2015/06/19 职场文书
SQL Server2019数据库之简单子查询的具有方法
2021/04/27 SQL Server