jQuery源码框架fn解读
(function( window, undefined ){
var jQuery = (function(){
var jQuery = function( selector, context ){
return new jQuery.fn.init( selector, context )
} jQuery.fn = jQuery.prototype = {
constructor: jQuery,
init: function( selector, context ){
if (!selector) return this;
var nodeList = (context || document).querySelectorAll( selector ),
i = 0,
length = nodeList.length;
for (; i<length; i+=1){
this[i] = nodeList[i];
}
this.length = nodeList.length;
return this;
}
}
//用fn的真正原因是
//如果不用fn,直接用jQuery.init 会返回undefined,主要是jQuery并不是new的对象,也就不能//访问原型,undefined不能设置原型
//jQuery.fn = {}可以直接访问init属性,所以fn必须写
console.log( jQuery.fn ); jQuery.fn.init.prototype = jQuery.fn; jQuery.fn.extend = jQuery.extend = function(obj){
var obj = obj || null;
if (!obj) return this;
for ( var i in obj){
if (!jQuery.fn[i]){
jQuery.fn[i] = obj[i];
}
}
return this;
} return jQuery;
})()
window.$ = window.jQuery = jQuery;
})( window, undefined )
下边是没有使用jQuery.fn的代码,使用了jQuery.fn的框架更简单,不用函数运行就可以对原型添加方法,也就是这一点,
因为直接jQuery.prototype不能直接添加方法,必须声明!但是jQuery.fn就可以,因为他不是原型而是一个{}object
jQuery.fn = jQuery.prototype = {};
<body> <h1>标题1</h1>
<h1>标题2</h1>
<h1>标题3</h1>
<script> var jQuery = function( selector, context ){
return new jQuery.prototype.init( selector, context );
} jQuery.prototype = { constructor: jQuery, init: function( selector, context ){ if ( !selector ) return;
var nodeList = ( context || document ).getElementsByTagName( selector ),
i = 0,
length = nodeList.length;
for (; i<length; i+=1){
this[i] = nodeList[i]
}
this.length = nodeList.length; return this
} } jQuery.prototype.init.prototype = jQuery.prototype;
jQuery.prototype.extend = function( obj ){
if ( !obj ) return;
for ( var i in obj ){
if ( !jQuery.prototype[i] ){
jQuery.prototype[i] = obj[i]
}
}
} jQuery.prototype.extend({
changeColor: function( color ){
if ( !color ) return;
var i = 0,
length = this.length;
for (; i<length; i+=1){
this[i].style.color = color;
}
return this;
}
});
jQuery('h1').changeColor('red');
//标准的写法 jQuery.fn.extend = jQuery.extend
//因为非标准的没有jQuery.fn 所以不能jQuery.extend()直接添加,必须jQuery.prototype.extend()
//进行添加,又因为jQuery.fn = jQuery.prototype = {},所以jQuery.fn是一个对象不用函数调用可以直//接添加
</script>
</body>
jQuery源码框架fn解读的更多相关文章
- jQuery源码笔记(一):jQuery的整体结构
jQuery 是一个非常优秀的 JS 库,与 Prototype,YUI,Mootools 等众多的 Js 类库相比,它剑走偏锋,从 web 开发的实用角度出发,抛除了其它 Lib 中一些中看但不实用 ...
- jquery源码解读
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐进增强)优雅的处理能 ...
- jQuery源码中的“new jQuery.fn.init()”什么意思?
所有文章搬运自我的个人主页:sheilasun.me 引子 最近打算试试看看jQuery的源码,刚开个头就卡住了.无论如何都理解不了jQuery源码入口部分中的 return new jQuery.f ...
- jQuery源码分析之整体框架
之前只是知道jQuery怎么使用,但是我觉得有必要认真的阅读一下这个库,在分析jQuery源码之前,很有必要对整个jQuery有个整体的框架概念,才能方便后面对jQuery源码的分析和学习,以下是我总 ...
- 三.jQuery源码解析之jQuery的框架图
这张图片是对jQuery源码截图,一点一点拼出来的. 现在根据这张图片来对jQuery框架做一些说明. 一.16~9404行可以发现,最外层是一个自调用函数.当jQuery初始化时,这个自调用函数包含 ...
- 读jQuery源码之整体框架分析
读一个开源框架,大家最想学到的就是设计的思想和实现的技巧.最近读jQuery源码,记下我对大师作品的理解和心得,跟大家分享,权当抛砖引玉. 先附上jQuery的代码结构. (function(){ / ...
- jQuery源码解读----part 2
分离构造器 通过new操作符构建一个对象,一般经过四步: A.创建一个新对象 B.将构造函数的作用域赋给新对象(所以this就指向了这个新对象) C.执行构造函数中的代码 D.返回这个新对象 最后一点 ...
- jQuery源码-dom操作之jQuery.fn.html
写在前面 前面陆陆续续写了jQuery源码的一些分析,尽可能地想要cover里面的源码细节,结果导致进度有些缓慢.jQuery的源码本来就比较晦涩,里面还有很多为了解决兼容问题很引入的神代码,如果不g ...
- jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究
终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...
随机推荐
- Java实现把图片转成字符画
1,先看效果图:
- imgtobase64
# -*- coding: utf-8 -*- import re import base64 from cStringIO import StringIO from PIL import Image ...
- c++ protected 访问限定
class A { protected: int mA; }; class B : public A{ public: void Func() { mA = 0; // ok A *a = this; ...
- uni-app 使用 iconfont
使用 uni-app 做项目时需要用到 iconfont.和 web 使用略有差别.谨以此记录. 因为 uni-app 不能使用本地字体图标库,所以不能直接下载使用. 1.将iconfont中需要的图 ...
- MFC新建工程中目录包含中文,资源文件打开失败
※尽量不适用中文,各种未知错误,嘿嘿 此方法临时解决问题,可以使程序运行,后续是否还有错误是未知数 需要修改3处位置: 1.资源文件中.rc 右键,点击“查看代码”,找到带中文的资源ID,把中文修改掉 ...
- ActiveMQ安装使用与spring整合配置教程
https://blog.csdn.net/qq_22075041/article/details/77602996
- 项目管理利器maven学习笔记(一):maven介绍及环境搭建
maven介绍 maven下载与环境搭建 http://maven.apache.org/download.cgi# 解压到指定位置,比如我解压到D盘 设置maven环境变量 添加一个变量名,变量值为 ...
- ucos中信号量 事件标志 消息队列都怎么用
信号量 事件标志和消息队列分别应用于什么场景(反正我学的时候有点闹不清,现在总结一下): 信号量和事件标志用于任务同步.详细来说,这个功能可以替代以前裸机中你打一个标记的功能,比如使用了一个定时器,5 ...
- CentOS7 yum安装配置 drbd-84-utils (外部模式)
1 安装环境介绍 1.1 系统环境 内核:3.10.0-862.el7.x86_64 版本:CentOS Linux release 7.5.1804 (Core) 主服务器:hostname = ...
- Spring:AOP
摘要 本文内容为我在网上搜集Spring AOP资料的汇总.摘抄. AOP是一种编程思想,其对不同对象进行了横向的抽象,将不同对象的.和主流程无关的公共逻辑抽象出来以方便维护.AOP的实现基础为AOP ...