通过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 相关文章推荐
js操作iframe的一些方法介绍
Jun 25 Javascript
Grunt入门教程(自动任务运行器)
Aug 06 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
Sep 12 Javascript
iframe中使用jquery进行查找的方法【案例分析】
Jun 17 Javascript
vue开发心得和技巧分享
Oct 27 Javascript
jquery实现的table排序功能示例
Mar 10 Javascript
将Sublime Text 3 添加到右键中的简单方法
Dec 12 Javascript
Vue-router 中hash模式和history模式的区别
Jul 24 Javascript
vue列表单项展开收缩功能之this.$refs的详解
May 05 Javascript
jquery中为什么能用$操作
Jun 18 jQuery
详解用async/await来处理异步
Aug 28 Javascript
浅谈JavaScript中的“!!”作用
Aug 03 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+dbfile开发小型留言本
2006/10/09 PHP
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
PHP创建PowerPoint2007文档的方法
2015/12/10 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
AngularJs动态加载模块和依赖注入详解
2016/01/11 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
vue实现短信验证码登录功能(流程详解)
2019/12/10 Javascript
Angular6项目打包优化的实现方法
2019/12/15 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
Python heapq使用详解及实例代码
2017/01/25 Python
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
python3.8.1+selenium实现登录滑块验证功能
2020/05/22 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
HTML5超炫酷粒子效果的进度条的实现示例
2019/08/23 HTML / CSS
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
党建示范点实施方案
2014/03/12 职场文书
日化店促销方案
2014/03/26 职场文书
品酒会策划方案
2014/05/26 职场文书
我的梦想演讲稿1000字
2014/08/21 职场文书
某集团股份有限公司委托书样本
2014/09/24 职场文书
小学语文教学随笔
2015/08/14 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers
Java生成日期时间存入Mysql数据库的实现方法
2022/03/03 Java/Android
Oracle锁表解决方法的详细记录
2022/06/05 Oracle