通过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 相关文章推荐
JavaScript 指导方针
Apr 05 Javascript
jQuery maxlength文本字数限制插件
Apr 16 Javascript
JQuery $.each遍历JavaScript数组对象实例
Sep 01 Javascript
20个实用的JavaScript技巧分享
Nov 28 Javascript
JS判断元素是否在数组内的实现代码
Mar 30 Javascript
AngularJs 国际化(I18n/L10n)详解
Sep 01 Javascript
jQuery实现鼠标跟随效果
Feb 20 Javascript
jquery replace方法去空格
May 08 jQuery
JavaScript实现简单评论功能
Aug 17 Javascript
详解VUE 数组更新
Dec 16 Javascript
基于JavaScript获取base64图片大小
Oct 18 Javascript
Vue 事件的$event参数=事件的值案例
Jan 29 Vue.js
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
DIY一个适配电脑声卡的动圈话筒放大器
2021/03/02 无线电
PHP模板引擎Smarty内建函数详解
2016/04/11 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
JavaScript实现数组在指定位置插入若干元素的方法
2015/04/06 Javascript
jquery实现Ctrl+Enter提交表单的方法
2015/07/21 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
javascript实现tab切换的四种方法
2015/11/05 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
Bootstrap每天必学之导航组件
2016/04/25 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
bootstrap fileinput 插件使用项目总结(经验)
2017/02/22 Javascript
vue2.0安装style/css loader的方法
2018/03/14 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
2018/08/20 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
python实现探测socket和web服务示例
2014/03/28 Python
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
python 文件操作api(文件操作函数)
2016/08/28 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
原生canvas制作画图小工具的踩坑和爬坑
2020/06/09 HTML / CSS
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
老师推荐信
2013/10/28 职场文书
创业计划书如何吸引他人眼球
2014/01/10 职场文书
七年级政治教学反思
2014/02/03 职场文书
前处理班长职位说明书
2014/03/01 职场文书
教室标语大全
2014/06/21 职场文书
发票退票证明
2015/06/24 职场文书
律师催款函范文
2015/06/24 职场文书
趣味运动会通讯稿
2015/07/18 职场文书