`
zhouyrt
  • 浏览: 1171935 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

读jq之二(两种扩展)

阅读更多

上一篇分析了jquery对象的组成,这次来分析下jquery的extend方法。部分如下:

 

jQuery.extend = jQuery.fn.extend = function() {
     ...
};

 

我们可以用$.extend去扩展自定义的对象,如:

 

var myself = {name:jack};
$.extend(myself, {setName:function)(n){this.name=n;} });
myself.setName("tom");

 

通过$.extend为对象myself添加了setName方法。但这里主要讨论$.extend如何构建jquery库的。不知注意到上面代码中jQuery.extend和jQuery.fn.extend是同一个函数。我们浏览下jquery库,发现有些方法是通过调用jQuery.extend扩展的,有的则是通过调用jQuery.fn.extend扩展的。下面分别讨论:

 

1,通过jQuery.extend扩展

     我们知道jQuery.extend中的jQuery类型是function,即typeof jQuery值为字符串“function”。如果把jQuery当成一个类,jQuery.extend相当于为该类添加了静态方法extend。静态方法是不需要new一个实例再去调用的,通过“类名+方法名”直接调用。即jQuery.extend(...),jQuery又被赋值给$。因此我们更习惯$.extend(...)。

 

     源码中直接调用jQuery.extend方法,只传一个参数。如下:

jQuery.extend({
	noConflict: function( deep ) {
		window.$ = _$;
		if ( deep )
			window.jQuery = _jQuery;
		return jQuery;
	},
        ...
});

 

我们知道extend中如果只传一个参数,那么将执行该句:

target = this;

即扩展自己,而这里的this则是function jQuery。也就是说给function jQuery添加了许多静态方法,这些方法都可以直接通过jQuery.xx(或$.xx)方式来调用,而不是先执行(调用)jQuery方法再去调用xx,如$("#id").xx。也许下面这个例子更容易理解:

function fun(){}//定义一个类(函数)

//为该类(函数)添加一个静态方法extend
fun.extend=function(obj){
	for(var a in obj)
		this[a] = obj[a];//注意:这里的tihs即fun
}

//调用extend为该类添加了静态属性name,静态方法method1
fun.extend({name:"fun",method1:function(){}});

//输出name,prototype,extend,method1
console.dir(fun)

 

因此,jquery中的isFunction, isArray, trim等都是静态方法,只能通过$.isFunction, $.isArray, $.trim来调用。而不能通过$("...").isFuction, $("...").isArray, $("...").trim调用。

 

2,通过jQuery.fn.extend扩展

     jQuery.fn等于jQuery.prototype,也就是说给function jQuery的原型(prototype)上挂了个extend方法。通过调用jQuery.fn.extend(object)来扩展时(注意只传一个参数object),extend函数中仍然会执行

target = this;

 而这时的this则是jQuery.prototype(上面则是jQuery函数自身)。即给jQuery.prototype上添加了许多属性,方法。当jQuery函数执行时,如$()或jQuery(),更多时候是$()。该函数会new一个jQuery(见上一篇jquery对象的组成)。这时则把扩展的属性,方法都附加到new生成的对象上了。也许下面这个示例更容易理解:

 

function fun(){}//定义一个类(函数)

//给该类原型上添加一个方法extned
fun.prototype.extend = function(obj){
	for(var a in obj)
		this[a] = obj[a];//注意:这里的this即是fun.prototype
}			

//调用extend方法给fun.prototype上添加属性,方法
fun.prototype.extend({name:"fun2",method1:function(){}})

//输出name,extend,method1
console.dir(new fun())

 

因此扩展的属性或方法都添加到jquery对象上了。

如bind, one, unbind等可以通过$("...").bind, $("...").one, $("...").unbind方式调用。却不能通过 $.bind, $.one, $.unbind方式调用。

 

jquery库与prototype库一样都是通过extend方法扩展出整个库的。相对来说jqueyr的扩展方式更难理解一些。

总结如下:

a,jQuery.extend({...})是给function jQuery添加静态属性或方法

b,jQuery().extend({...})是给jquery对象添加属性或方法。

 

ps:这里的jQuery即为$。

 

 

 

  • jq2.zip (614 Bytes)
  • 下载次数: 96
分享到:
评论
5 楼 LovingBaby 2016-03-10  
LovingBaby 写道
function fun() {
}
fun.prototype.extend = function (obj) {
    for (var a in obj) {
        this[a] = obj[a];//this === fun.prototype
    }
    console.log(this)
};
fun.prototype.extend({name: 'prototype-extend', method2: function () {
}});
console.log(new fun());
//这是我用NodeJS运行的结果:
{ extend: [Function],
  name: 'prototype-extend',
  method2: [Function] }
{}
//很纳闷,为什么原型的属性方法,对象没有继承过来,这个和V8引擎有关系?

哈哈,这是早期的回答,本来就是应该这样的,特来更正....
4 楼 LovingBaby 2014-07-21  
function fun() {
}
fun.prototype.extend = function (obj) {
    for (var a in obj) {
        this[a] = obj[a];//this === fun.prototype
    }
    console.log(this)
};
fun.prototype.extend({name: 'prototype-extend', method2: function () {
}});
console.log(new fun());
//这是我用NodeJS运行的结果:
{ extend: [Function],
  name: 'prototype-extend',
  method2: [Function] }
{}
//很纳闷,为什么原型的属性方法,对象没有继承过来,这个和V8引擎有关系?
3 楼 LovingBaby 2014-07-21  
兄台的理解很透彻,准备读完你的博客!
2 楼 blank_y 2010-01-18  
汗,看到这些理解真是汗颜啊。
平时只管用,从不管这些之前区别,达到目的就行了。
以后多来学习下
1 楼 yuyue618 2010-01-14  
比我理解的更深啊

相关推荐

    JQ tab标签页

    一个基本的JQ Tab标签页由两部分组成:导航栏(tab headers)和内容区域(tab panes)。导航栏中的每个li元素对应一个内容区域,通过添加`class="active"`可以指定默认显示的标签页。 ```html ...

    51单片机嵌入式语音模块说明(JQ8900-16P)

    在控制方式上,JQ8900-16P具备多模态操作,包括两线串口模式、一线串口控制和按键模式,极大地扩展了其兼容性和灵活性。该模块可以使用U盘、TF卡和SPIFLASH作为存储介质,同时,它还支持USB声卡、读卡器和HID控制,...

    jq带节点的步骤进度条

    - **样式设计**:进度条需要两种不同的样式以满足多样化的设计需求。 - **动态更新**:根据步骤的完成状态,进度条应实时更新显示当前步骤。 - **易用性**:代码应简洁易懂,便于其他开发者理解和使用。 ### 3. ...

    JQ 徘徊轮播LI

    **JQ 徘徊轮播LI**是一种基于jQuery(JQ)实现的用户界面(UI)组件,主要用于创建一种特殊的轮播效果。这种轮播方式被称为“徘徊轮播”,其特点是能够动态追加新的LI(列表项)数据,使得轮播内容在前端持续更新,...

    JQ,JS表单验证大全

    `JQ` 和 `JS` 是两种常见的JavaScript库,它们在处理表单验证时各有优势。`JQ`(jQuery)简化了DOM操作,而`JS`(JavaScript)提供了更为底层的控制。本文将深入探讨如何使用jQuery(JQ)和纯JavaScript(JS)进行...

    JS+JQ随机抽奖代码

    在IT行业中,JavaScript(简称JS)和jQuery(简称JQ)是前端开发中常用的两种库和语言,它们在创建交互式网页应用时发挥着至关重要的作用。本项目名为"JS+JQ随机抽奖代码",它提供了一种利用这两种技术实现随机抽奖...

    JQ工具包+CSS3工具包

    在IT行业中,"JQ工具包+CSS3工具包"是一个组合,它包含了JavaScript库jQuery(简称JQ)以及与之相关的CSS3技术。这个资源集合可能是一个宝贵的开发辅助工具,提供了关于这两部分的详细文档和参考资料,帮助开发者更...

    jq导出execl-----

    3. **生成CSV或HTML表格**:为了创建Excel文件,一种常见方法是先生成一个CSV(逗号分隔值)文件或者HTML表格,因为Excel可以很好地识别这两种格式。jQuery可以用于动态创建HTML元素,并将数据插入到表格中。 4. **...

    api jdk jq js html

    API可以分为两种类型:公共API和私有API。开发者需遵循API文档来正确使用API,确保程序正常运行。 2. JDK(Java Development Kit): JDK是Java编程语言的开发工具包,由Oracle公司提供。它包含Java编译器、Java...

    基于JQ的多选加新闻循环

    在IT行业中,jQuery(通常简称为JQ)是一种广泛使用的JavaScript库,它简化了DOM操作、事件处理、动画效果和Ajax交互。"基于JQ的多选加新闻循环"这个项目,显然涉及到两个主要的技术点:jQuery的选择器和事件处理...

    jquery easyui pagination 分页插件扩展

    在描述中提到的"重写的分页属性"可能是指通过这两种方式之一,对原有的分页属性进行了增强,例如: - **自定义页码样式**:可能增加了新的CSS类,允许用户自定义页码按钮的外观。 - **动态加载数据**:可能实现了...

    jq 插件 实现拖拽

    在前端开发中,jQuery(通常简称为jq)是一种广泛使用的JavaScript库,它简化了DOM操作、事件处理、动画效果和Ajax交互。"jq 插件 实现拖拽"的主题涉及到了如何利用jQuery来创建一个允许用户通过拖动来移动元素的...

    jQ-iconfont实现的删除对话框.7z

    例如,一个简单的删除对话框可能包含一个`<div>`作为对话框容器,`<p>`标签用于显示消息,以及两个`<button>`元素分别代表“确定”和“取消”选项。CSS(层叠样式表)则用来设置对话框的样式,如位置、大小、颜色、...

    基于jq的分页插件,简单易用。代码未压缩

    基于jq的分页插件,简单易用。 $(function () { $("#page").initPage({ maxPage: 5, //最大显示数 pageCount: 7, //总页数 callBack: function (data) { ...有其他两种分页风格,查看test.html可知。

    JQ 最少代码实现多图切换

    jQuery是一种广泛使用的JavaScript库,它简化了DOM操作、事件处理和动画效果,使得开发者能够用更少的代码完成复杂的交互功能。 在网页设计中,多图切换通常用于展示一组图片,例如产品展示、幻灯片或轮播图。这种...

    JQ做的DIV展开收缩代码

    手风琴效果是一种常见的交互设计,它允许用户逐个展开或收缩内容区域,以节省页面空间并提高用户体验。 首先,让我们了解jQuery的基本概念。jQuery是一个快速、简洁的JavaScript库,它简化了HTML文档遍历、事件处理...

    jq分页控件

    本篇将详细讲解"jq分页控件"以及与之相关的jQuery选项卡功能。 首先,我们来看"jq分页控件"。这里的"jq"指的是jQuery,一个轻量级、高性能的JavaScript库,它简化了HTML文档遍历、事件处理、动画设计和Ajax交互。...

    jq中ppt形式播放圖片

    在IT行业中,jQuery(简称JQ)是一种广泛使用的JavaScript库,它简化了DOM操作、事件处理、动画制作等任务。本话题将详细讲解如何利用jQuery实现一个类似PowerPoint(PPT)的图片播放功能,包括页面翻动效果、图片...

    如何编写jquery组件(jq插件).zip

    jQuery组件(也称为jQuery插件)是扩展jQuery功能的一种方式,允许开发者根据需求创建自定义的工具和功能。下面我们将深入探讨如何编写jQuery组件。 ### 一、理解jQuery组件的基本结构 一个简单的jQuery插件通常由...

    JQ路由的原理实现-全包

    jQuery Router支持命令式和声明式两种导航方式。命令式导航通过调用`$.router.navigate()`方法手动改变URL;声明式导航则是在HTML中使用特殊链接或按钮,通过设置`data-url`属性来指定目标路由。 ### 7. 嵌套路由与...

Global site tag (gtag.js) - Google Analytics