jQuery使用(十三):工具方法
- proxy()
- onConflict()
- each()
- map()
- parseJson()
- makeArray()
proxy()
$.proxy()的实现机制与原生javaScript中的bind()方法实现机制一致,都是用来修改函数执行的this指向,我在前面的博客中有bind的源码剖析:源码来袭:bind手写实现,可以参考。这里我就使用proxy来实现一个小demo。
//html
<div class="demo" style="width:100px;height:100px; background-color:red;">
//js
//有需求是点击demo触发一个对象实例的方法,这个方法执行的时候还需要这个对象实例的其他模块
var list = {
init:function(){
this.ms = 123;
this.dom = $(".demo")[0];
this.bindEvent(); },
bindEvent : function(){
this.demo.onclick = this.show;
},
show : function(){
console.log(this.produseMs(this.ms));
},
produseMs : function(ms){
return ms + 111;
}
}
list.init();
这段代码看似好像没有什么问题,但是我们知道事件触发的函数是异步执行,会导致函数内部的this丢失,所以这段代码就是有bug的,修改的方式如下:
//this.demo.onclick = this.show;
this.dom.onclick = $.proxy(this.show,this);
使用proxy将list对象绑定到show方法上,就解决了,与原生的js中的bind方法的功能没啥差别。
onConflict()
防止$变量命名冲突。
//将jQuery的$修改成$c
var $c = $.onConflict();
源码实现的非常简单,我把它粘出来看看:
_$ = window.$;//如果全局自定义了$,就这个自定义的$用_$保存。
noConflict: function( deep ) {
if ( window.$ === jQuery ) {
window.$ = _$;
} if ( deep && window.jQuery === jQuery ) {
window.jQuery = _jQuery;
} return jQuery;
}
//jQuery代码末尾处,将window.$修正为jQuery的简写引用
if ( typeof window === "object" && typeof window.document === "object" ) {
window.jQuery = window.$ = jQuery;
}
jQuery内部代码将$始终指向jQuery对象,将自定义的$保存在_$上,如果触发noConflict()就通过window.$=_$;修正到自定义的$指向上,还可以给方法传入一个真值(deep),同步修改jQuery指向。
each()
在实例方法中讲过$().each()方法,这两个方法功能是一样的,只不过$.each()可以将要操作的数组或者类数组、对象作为参数传入进入,拓展了使用范围。
$.each(arr,function(index,ele){
//index -- 索引值/属性名称,ele -- 元素值
console.log(index + ele);
})
map()
手册上说这个方法是用来修改数组,但实质上这个方法的功能是基于一个数组操作来获取一个新的数组,不会修改该原数组,通过回调方法的每次返回值产生一个新的数组。看看下面这个示例:
var arr = [1,2,3];
var a = $.map(arr,function(ele,index){
return ele + 1;
});
console.log(a);//[2, 3, 4]
值得注意的是map方法传入回调方法的参数和each方法传入回调方法的参数是相反的。
parseJSON()
将json数据(json字符串)转换成对象,与元素js中的JSON.parse()方法的功能一致。因为jQuery内部只是将原生的JSON.parse()方法封装到自己的jQuery对象上而已,目的只是为了减少调用访问作用域链的长度,提高效率,另一方面防止某处作用域上自定义JSON.parse方法冲突。
parseJSON: JSON.parse;//jQuery内部代码
makeArray()
将类数组转换成数组形式,作为一个新的数组返回。
var arr = $.makeArray(obj);
这个方法值得我们思考的是如何实现,假设手写实现这样的功能怎么做?
var obj = {0:"o",1:"a",2:"b",3:"c",length:4}
var arr = Array.prototype.slice.call(obj);// ["o", "a", "b", "c"]
不过jQuery实现的比较复杂,这是因为makeArray()方法除了转换功能,还有添加元素的功能,直接示例来看吧。(这部分API上没有说明哦)
var obj = {
0:"a",
1:"b",
2:"c",
length:3
}
$.makeArray("d",obj);
console.log(obj);//{0: "a", 1: "b", 2: "c", 3: "d", length: 4}
可以通过makeArray向有序的对象添加元素,但是这还没完,后面还有惊喜:
//还是上一个示例的obj
var arr = [1,2,3];
$.makeArray(arr,obj);
console.log(obj);//{0: "a", 1: "b", 2: "c", 3: 1, 4: 2, 5: 3, length: 6}
除了添加功能还有合并功能哦。
jQuery使用(十三):工具方法的更多相关文章
- jquery-12 jquery中的工具方法有哪些
jquery-12 jquery中的工具方法有哪些 一.总结 一句话总结:四个较常用方法.1.isArray();2.isFunction();3.isEmptyObejct();4.trim(); ...
- jquery中的工具方法$.isFunction, $.isArray(), $.isWindow()
本文正式地址:http://www.xiabingbao.com/jquery/2015/07/25/jquery-judge-type 在javascript中对变量类型的判断中,我们讲解了了jqu ...
- JQuery extend()与工具方法、实例方法
使用jQuery的时候会发现,jQuery中有的函数是这样使用的: $.get(); $.post(); $.getJSON(); 有些函数是这样使用的: $('div').css(); $('ul' ...
- jQuery笔记之工具方法extend插件扩展
jQuery工具方法 $.extend()插件扩展(工具方法) $.fn.extend()插件扩展(实例方法) 浅度克隆.深度克隆 两个方法基本是一样的,唯一不同的就是调用方式不一样 -------- ...
- jQuery笔记之工具方法
jQuery 工具方法 $.type()判断数据类型 $.isArray() $.isFunction() $.isWindow()... $.trim()消除空格 $.proxy()改变this指向 ...
- jQuery 第九章 工具方法之插件扩展 $.extend() 和 $.fn.extend()
$.extend() $.fn.extend() -------------------------------------------------- $.extend() 插件扩展(工具方法) jq ...
- jQuery 第九章 工具方法
$.type() $.isArray() $.isFunction() $.isWindow()... $.trim() $.proxy() $.noConflict() $.each() $.map ...
- jQuery 第十章 工具方法-高级方法 $.ajax() $.Callbacks() .....
$.ajax() $.Callbacks() $.Deferred() .then() $.when() ---------------------------------------------- ...
- jQuery笔记之工具方法—Ajax 优化回调地狱
在上一篇文我们说到了回调地狱不好的地方,今天我们看看怎么来优化它,让它可以运用到实际开发中. 什么是回调地狱?回调地狱就是一个函数里面嵌套了所有功能函数,然后缩略图形成一个三角形. 这样的代码可复用性 ...
- jQuery笔记之工具方法—高级方法Ajax
$.ajxa() ——基本使用 前提:先了解js的执行机制 $.Callbacks()——回调 $.Deferred()——异步 $.when() 网络服务器链接由<渡一教育>提供 --- ...
随机推荐
- 010 Editor v8.0.1(32 - bit) 算法逆向分析、注册机编写
010 Editor 的逆向分析整体算下来还是比较简单的,将程序拖入OD,通过字符串搜索定位到核心代码,经过分析,主要是如下图所示的两个关键函数,返回正确的值,才算是注册成功. 00409C9B 这个 ...
- Java多线程基础(二)
1.多线程数据安全 线程同步:多个线程需要访问同一资源时,需要以某种顺序来确定该资源某一时刻只能被一个线程使用.从而,解决并发操作可能带来的异常. 2.同步代码块实现同步(部分代码的访问,我们希望它同 ...
- webstorm 的 .后缀名-tab快捷键
if (key) {}//key.if tab if (!key) {}//key.else tab if (key != null) {}//key.notnull tab if (typeof k ...
- (转载)Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置
近期做那个python的开发,今天就来简单的写一下开发路线的安装及配置, 开发路线 Python3.6.1+Pycharm5.0.6+Django1.11+MySQL5.7.18 1-安装Python ...
- 【Linux基础】Unix与Linux操作系统介绍
一.Unix和Linux操作系统概述 1.Unix是什么 UNIX是一个计算机操作系统,一个用来协调.管理和控制计算机硬件和软件资源的控制程序. 2.Unix特点 (1)多用户:在同一时刻可以有多个用 ...
- EXTJS的使用
最近一段时间一直使用Extjs作为前端,通过HTTP与.net后端进行交互,今天总结一下EXTJS,方便以后复习. 1.概念: ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用java ...
- Business Intelligence Tools We Recommend 1/4 – Metabase
May 24, 2018 by Arturs Oganesyan-Peel BI is useful. It’s pretty. But it never really matters unless ...
- 3.20 总结 java程序流程控制
- Push rejected: Push to origin/master was rejected错误解决方案
解决方案如下: 1.切换到自己项目所在的目录,右键选择GIT BASH Here,Idea中可使用Alt+F12 2.在terminl窗口中依次输入命令: git pull git pull orig ...
- 第十届蓝桥杯省赛JavaB组个人题解
前言 以下的第十届蓝桥杯Java B组省赛的题目题解只是我个人的题解,提供一些解题思路,仅作参考,如有错误,望大家指出,不甚感激,我会及时更改. 试题 A: 组队 ----- 答案:490 [问题描述 ...