`
zhouyrt
  • 浏览: 1125521 次
  • 性别: 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的分页插件,简单易用。代码未压缩

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

    jquery收集效果集合一些选项卡/菜单等很实用的特效

    JS 特效 选项卡 菜单 下拉菜单 滚动特效 相册特效等等 网页特效 素材 web div+css 3级横向导航菜单 163网盘折叠菜单 CSS下拉菜单 div显示隐藏效果 Javascrip实现相册缩略图导航的两种效果 JS 图片轮换 封装中处理...

    jQuery插件开发全解析

    jQuery插件的开发包括两种:一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法。jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加...

    jQuery中map函数的两种方式

    两种方式: 1、直接jQuery.map //将原数组中每个元素加 4 转换为一个新数组。 $.map( [0,1,2], function(n){ return n + 4; }); //结果: [4, 5, 6] //原数组中每个元素扩展为一个包含其本身和其值加 1 的数组,并...

    用JQUERY制做的柱形图统计汇总表的JS前台插件

    柱形图载入方式有一次性全部载入和单步载入两种,而单步载入时,又可根据条件判断是否移除最左边(时间最早的)那条组柱状图。 //5.数据载入的方法分为本地载入JSON和远程载入JSON两种,而远程载入时,则采用JSONP...

    jquery Accordion 多级导航菜单 可收缩展开.rar

    jquery Accordion 收缩展开的多级导航,这是一种比较常见的形式了,点击一级菜单,二级菜单随即展开,目前仅支持两级,更多级需要自己扩展,这需要你认真阅读代码以及了解jQuery类库,本菜单从老外网站获得,欢迎...

    基于JQUERY的改进型浮动层(右键)列表菜单

    两种方法都要传一个必要的事件名称参数,如contextmenu右击,mousedown鼠标按下,比原来只能右键弹出更灵活。 改变了点击菜单项目时,触发方法的传参定义,现在只传两个参数:(点击菜单项目单元的ID,触发浮动菜单...

    基于jquery的改进型(右键)列表菜单

    两种方法都要传一个必要的事件名称参数,如contextmenu右击,mousedown鼠标按下,比原来只能右键弹出更灵活。 改变了点击菜单项目时,触发方法的传参定义,现在只传两个参数:(点击菜单项目单元的ID,触发浮动菜单...

    jQuery自定义插件详解及实例代码

    jQuery编写插件有两种方式 1.添加jQuery对象级别的插件,原理是给jQuery类添加方法。 写法如下: (function($){ $.fn.extend({ 函数名:function(自定义参数){ //自定义插件代码部分 } });

    jQuery Password Validation(密码验证)

    jQuery Password Validation(密码验证)插件扩展了 jQuery Validate 插件,提供了两种组件: 一种评价密码的相关因素的功能:比如大小写字母的混合情况、字符(数字、特殊字符)的混合情况、长度、与用户名的相似度...

    WebFrameworkGrammar:JS框架语法

    更多内容的提示,有两种做法,JSDoc或SDocML语法库。 HBuilder支持开发者自助添加JS语法库框架。 格式有2种 一种是SDocML,这是一种基于XML的通用语法描述格式,通过在HBuilder里对项目点右键-引入框架语法,来给...

    jQuery+ajax实现实用的点赞插件代码

    之前给大家总结了jQuery插件开发的两种方式,这里就实践一下,做一款点赞特效插件,先看看效果吧:  废话少说,上代码: //***扩展对象点赞插件、点赞特效***// //***Zynblog**// //***2016-5-11**// //***用法:...

    配置好的傻瓜化小狼毫全拼+多种双拼+五笔86-98+笔画输入法v200312 - 17种方案

    末Z识别:前面已经谈及它的含义,它包含两个含义:末,即重复末编码;Z,即不足四码打Z识别码。 考虑到符号没有明显笔顺的特殊性,词库中对编码采取了容错处理,比如?,可以是:OCC或OCZ,即先要圈再打里面内容;也...

    jquery插件使用方法大全

    用jq的前提,首先要引用一个有jq的文件 [removed][removed] 这个是jquery官方最新的地址。可用在自己网站里加个这个,就能使用jquery了。 但仍然建议下载到本地服务器上。 编辑本段找到你了!  在编写js库代码时候...

    华西网源码

    这里有两种情况,$_GET['catid'] == '1' 这个代表的是频道ID , $_G['forum']['fup'] == '2' 这个代表的是分区ID, 注意不要混淆了 下面举个修改实例 如:你的频道ID是11,分区的ID为 23 的话,那么 以上代码...

Global site tag (gtag.js) - Google Analytics