17-underscore库(下)
一、函数介绍
1、bind
结构
_.bind(function, object, *arguments)
说明
一个对象中所有的成员函数的this都指向这个对象
举例
_.bind(function, object, [*arguments])
var func = function(greeting){
return greeting + ': ' + this.name //this指向的是bind的第二个参数
};
var newfunc = _.bind(func, {name : 'moe'}, 'hi');
// bind返回的是一个新的function对象
2、bindAll
结构
_.bindAll(object, *methodNames)
说明
最常见的方法。作用是改变默认的function中的this指向。
举例
var buttonView = {
label : 'underscore',
onClick : function(){ alert('clicked: ' + this.label); },
onHover : function(){ console.log('hovering: ' + this.label); }
};
_.bindAll(buttonView);
jQuery('#underscore_button').bind('click', buttonView.onClick);
//当成员函数作为事件监听的时候,因为默认的事件监听,this都会指向当前事件源
//bindAll之后可以保证onClick中的this仍指向buttonView
3、once
结构
_.once(function)
说明
能确保func只调用一次,如果用func返回一个什么对象,这个对象成了单例。
举例
var initialize = _.once(createApplication);
initialize();
initialize();
4、warp
结构
_.wrap(function, wrapper)
说明
可以将函数再包裹一层,返回一个新的函数,新的函数里面可以调用原来的函数,可以将原函数的处理结果再处理一次返回
举例
var hello = function(name) { return "hello: " + name; };
//wrap返回一个新的函数
hello = _.wrap(hello, function(func) {
// 在新函数内部可以继续调用原函数
return "before, " + func("moe") + ", after";
});
hello();
5、delay
结构
_.delay(function, wait, [*arguments])
说明
在指定的wait后面执行函数与setTimeout功能一致
举例
var log = _.bind(console.log, console);
_.delay(log, 1000, 'logged later');
6、defer
结构
_.defer(function, [*arguments])
说明
也是延迟执行方法,不同的是他能保证在当前堆栈中的所有的代码跑完之后再执行function。其实就是setTimeout(fn,1);
举例
_.defer(function(){ alert('deferred'); });
7、compose
结构
_.compose(*functions)
说明
将多个函数处理过程合并,每个函数可以调用前面函数的运行结果,_.compose(func1,func2);相当于func1(func2())
举例
var greet = function(name){ return "hi: " + name; };
var exclaim = function(statement){ return statement.toUpperCase() + "!"; };
var welcome = _.compose(greet, exclaim);
welcome('moe');
8、after:
结构
_.after(count, function)
说明
创建一个新的函数,当func反复调用时,count次才调用一次
举例
function a(){
alert("a");
}
var afterA = _.after(3,a);
afterA();//调用
afterA();//不alert
afterA();//不alert
afterA();//调用
9、memoize
结构
_.memoize(function, [hashFunction])
说明
该方法可以缓存函数返回结果,如果一个函数计算需要很长的时间,多次反复计算可以只计算一次缓存结果,默认的缓存key是函数调用时的第一个参数,也可以自己定义function(第二个参数)来计算key
举例
_.memoize = function(func, hasher) {
var memo = {};//缓存存放位置
//_.indentity默认取数组第一个元素
hasher || (hasher = _.identity);
return function() {
var key = hasher.apply(this, arguments);
return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
};
};
二、对象方法介绍
1、keys
结构
_.keys(object)
说明
可以非常方便地返回一个object自身所有的key,但不包含从原型链继承下来的
举例
function Student(name, age) {
this.name = name;
this.age = age;
}
var xiaoming = new Student('小明', 20);
_.keys(xiaoming); // ['name', ‘age']
2、allKeys
结构
_.memoize(function, [hashFunction])
说明
除了object自身的key,还包含从原型链继承下来的
举例
function Student(name, age) {
this.name = name;
this.age = age;
}
Student.prototype.school = 'No.1 Middle School';
var xiaoming = new Student('小明', 20);
_.allKeys(xiaoming); // ['name', 'age', 'school']
3、values
结构
_.values(object)
说明
和keys()类似,values()返回object自身但不包含原型链继承的所有值
举例
var obj = {
name: '小明',
age: 20
};
_.values(obj); // ['小明', 20]
4、mapObject
结构
_.mapObject(object, iteratee, [context])
说明
就是针对object的map版本
举例
var obj = { a: 1, b: 2, c: 3 };
// 注意传入的函数签名,value在前,key在后:
_.mapObject(obj, (v, k) => 100 + v); // { a: 101, b: 102, c: 103 }
5、invert
结构
_.invert(object)
说明
把object的每个key-value来个交换,key变成value,value变成key
举例
var obj = {
Adam: 90,
Lisa: 85,
Bart: 59
};
_.invert(obj); // { '59': 'Bart', '85': 'Lisa', '90': 'Adam' }
6、extend
结构
_.extend(destination, *sources)
说明
把多个object的key-value合并到第一个object并返回
举例
var a = {name: 'Bob', age: 20};
_.extend(a, {age: 15}, {age: 88, city: 'Beijing'});
// {name: 'Bob', age: 88, city: 'Beijing'}
// 变量a的内容也改变了:
a; // {name: 'Bob', age: 88, city: ‘Beijing'}
注意:如果有相同的key,后面的object的value将覆盖前面的object的value
7、extendOwn
结构
_.extendOwn(destination, *sources)
说明
extendOwn()和extend()类似,但获取属性时忽略从原型链继承下来的属性
举例
_.pick({name: 'moe', age: 50, userid: 'moe1'}, 'name', 'age');//{name: 'moe', age: 50}
_.pick({name: 'moe', age: 50, userid: 'moe1'}, function(value, key, object) {
return _.isNumber(value);
});//{age: 50}
8、clone
结构
_.clone(object)
说明
如果我们要复制一个object对象,就可以用clone()方法,它会把原有对象的所有属性都复制到新的对象中
注意:clone()是“浅复制”。所谓“浅复制”就是说,两个对象相同的key所引用的value其实是同一对象
source.skills === copied.skills; // true
也就是说,修改source.skills会影响copied.skills。
举例
var source = {
name: '小明',
age: 20,
skills: ['JavaScript', 'CSS', 'HTML']
};
var copied = _.clone(source)
9、isEqual
结构
_.isEqual(object, other)
说明
extendOwn()和extend()类似,但获取属性时忽略从原型链继承下来的属性
举例
var o1 = { name: 'Bob', skills: { Java: 90, JavaScript: 99 }};
var o2 = { name: 'Bob', skills: { JavaScript: 99, Java: 90 }};
o1 === o2; // false
_.isEqual(o1, o2); // true
isEqual()其实对Array也可以比较
var o1 = ['Bob', { skills: ['Java', 'JavaScript'] }];
var o2 = ['Bob', { skills: ['Java', 'JavaScript'] }];
o1 === o2; // false
_.isEqual(o1, o2); // true
17-underscore库(下)的更多相关文章
- Ubuntu 17.04版本下,opencv进行源码编译安装
本文主要针对Ubuntu 17.04版本下,opencv进行源码编译安装.开发环境主要针对python 对 openCV库的调用. 安装 gcc cmake 编译环境 sudo apt-get ins ...
- BCG界面库下的Windows8 UI界面样式www.webui8.com
BCG界面库下的Windows8 UI界面样式(Metro风格)控件主要有以下一些功能: 规则的大块磁贴 支持完整键盘导航 Tile组 标题(Caption) 标题按钮(Caption buttons ...
- Python的numpy库下的几个小函数的用法
numpy库是Python进行数据分析和矩阵运算的一个非常重要的库,可以说numpy让Python有了matlab的味道 本文主要介绍几个numpy库下的小函数. 1.mat函数 mat函数可以将目标 ...
- 第一百三十二节,JavaScript,封装库--下拉菜单
JavaScript,封装库--下拉菜单 封装库,增加了3个方法 shu_biao_yi_ru_yi_chu()方法,给元素设置鼠标移入移出事件,接收两个参数,参数是移入和移出时的执行函数(包含代码) ...
- 基于jsmpeg库下使用ffmpeg创建视频流连接websocket中继器传输视频并播放
这个功能的基本工作是这样的: 1.使用node运行jsmpeg库下的websocket-relay.js文件,这个文件的作用是创建一个websocket视频传输中继器 2.运行ffmpeg,将输出发送 ...
- sqlserver查询当前库下,一张表的表名,字段名,字段类型,字段长度
sqlserver版: 查询当前数据库下所有表名: select * from sys.tables; 查询当前库下,一张表的表名,字段名,字段类型,字段长度: select a.name 表名,b. ...
- mysql下批量清空某个库下的所有表(库不要删除,保留空库)
总所周知,mysql下要想删除某个库下的某张表,只需要切换到该库下,执行语句"drop table tablename"即可删除!但若是该库下有成百上千张表,要是再这样一次次执行d ...
- mysql通过mysqldump工具,对某个库下的表进行备份
需求描述: 使用mysqldump工具对某个库下的表进行备份的方法. 操作过程: 1.通过mysqldump工具完成此目的 [mysql@redhat6 MysqlDb_Backup]$ mysqld ...
- mysql5.7 mysql库下面的user表没有password字段无法修改密码
如题所述,mysql5.7 mysql库下面的user表没有password字段无法修改密码, 5.7版本已经不再使用password来作为密码的字段了 而改成了authentication_st ...
- 将MySQL库的表转入到MSSQL中的某个库中(Employees下的Employees表 → pubs库下)_2
将MySQL库的表转入到MSSQL中的某个库中(Employees下的Employees表 → pubs库下, 此pubs下的表名是employee,不冲突),方法大致以下几个(另有其他方法待补充), ...
随机推荐
- 关于格式转换 “%a.bs”
这个形式的格式转换符用于输出, 如果a <= b, 那么输出的字符串串长大于等于a, 小于b; 否则, 输出的串长按照a指定的输出. (不够,用空格补齐)
- alpha发布之小组评论
在alpha发布之后,让我看到了,大家都很努力,在alpha发布前大家都尽量完成自己的项目,虽然大家都很忙,但是,都在抽出时间趟黑起早的完成项目,在你们身上有很多很值得我学习的地方,虽然我认为半夜睡觉 ...
- C# ArrayList
一.定义 System.Collections.ArrayList类是一个特殊的数组(即动态数组).通过添加和删除元素,就可以动态改变数组的长度. 二.优点 动态的增加和删除元素,实现了ICollec ...
- 【iCore3 双核心板】例程二十一:LAN_TCPS实验——以太网数据传输
实验指导书及代码包下载: http://pan.baidu.com/s/1ntTjWpV iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 友盟推送里面的Alias怎么用?可以理解成账号吗?
友盟推送里面的Alias怎么用?可以理解成账号吗? 我们的App有自己的账号体系的,想在每次用户登陆的时候,给用户发一个欢迎消息. 看了一下友盟推送,里面有一个概念叫做Alias(别名),但是官方文档 ...
- mac svn 更新到新版本1.8
1.执行:brew install scons 如果没装brew,先装它.安装命令如下:curl -LsSf http://github.com/mxcl/homebrew/tarball/maste ...
- mac地址、IP地址和端口号
看了很多遍,才整理出来我对整个通信过程的理解,大致如下,后期会不断学习补充更正: 在利用TCP/IP协议族进行通信的时候,有三个比较关键的确认身份的信息:mac地址.IP地址和端口号. mac地址是在 ...
- [BS-29] 给UIView添加背景图片
给UIView添加背景图片 //默认情况下只能设置UIView的背景颜色,不能给UIView设置背景图片,但通过绘图知识可以做到 - (void)drawRect:(CGRect)rect { [su ...
- Nginx下配置SSL安全协议
生成证书: # cd /usr/local/nginx/conf # openssl genrsa -des3 -out server.key 1024 # openssl req -new -key ...
- AndroidStudio第一个项目HelloWorld
实验内容 在Android Studio中创建项目 创建并启动Android模拟器 项目的编译和运行 实验要求 在安装好的AndroidStudio上建立第一个工程 创建并启动Android模拟器 编 ...