underscore源码解析(object)

//用来变对象的。可以没有value直接传list,把list变一个对象//也可以传长度和list一样的value,来构成数组_.object = function(list, values) {    var result = {};    for (var i = 0, length = list && list.length; i < length; i++) {        if (values) {            result[list[i]] = values[i];        } else {            result[list[i][0]] = list[i][1];        }    }    return result;};

//获取对象的所有键集合,有原生的nativeKeys,就用原生。//貌似ie9以下有个枚举bug,实例的toString会覆盖原型上的toString,toString就变成不可枚举了,都没试出来过。。。。//!({toString: null}).propertyIsEnumerable(‘toString‘);_.keys = function(obj) {    if (!_.isObject(obj)) return [];    if (nativeKeys) return nativeKeys(obj);    var keys = [];    for (var key in obj) if (_.has(obj, key)) keys.push(key);    // Ahem, IE < 9.    if (hasEnumBug) collectNonEnumProps(obj, keys);    return keys;};

// 所有键列出来,实例和原型的_.allKeys = function(obj) {    if (!_.isObject(obj)) return [];    var keys = [];    for (var key in obj) keys.push(key);    // Ahem, IE < 9.    if (hasEnumBug) collectNonEnumProps(obj, keys);    return keys;};

// 实例键的值组成一个数组_.values = function(obj) {    var keys = _.keys(obj);    var length = keys.length;    var values = Array(length);    for (var i = 0; i < length; i++) {        values[i] = obj[keys[i]];    }    return values;};

//类似map,只不过obj是对象,用iteratee迭代每个键值对,返回新数组_.mapObject = function(obj, iteratee, context) {    iteratee = cb(iteratee, context);    var keys =  _.keys(obj),        length = keys.length,        results = {},        currentKey;    for (var index = 0; index < length; index++) {        currentKey = keys[index];        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);    }    return results;};

//把一个对象转变为一个[key, value]形式的数组。_.pairs = function(obj) {    var keys = _.keys(obj);    var length = keys.length;    var pairs = Array(length);    for (var i = 0; i < length; i++) {        pairs[i] = [keys[i], obj[keys[i]]];    }    return pairs;};

// 对象键值对互换位置,要保证键值对中值的唯一性_.invert = function(obj) {    var result = {};    var keys = _.keys(obj);    for (var i = 0, length = keys.length; i < length; i++) {        result[obj[keys[i]]] = keys[i];    }    return result;};//把对象中的函数堆到一个数组中,函数名按字母a-z排序_.functions = _.methods = function(obj) {    var names = [];    for (var key in obj) {        if (_.isFunction(obj[key])) names.push(key);    }    return names.sort();};//对象的扩展,扩展传入的所有属性,包括原型链_.extend = createAssigner(_.allKeys);

////对象的扩展,扩展传入的所有属性,不包括原型链_.extendOwn = _.assign = createAssigner(_.keys);
时间: 2024-10-25 17:20:46

underscore源码解析(object)的相关文章

underscore源码解析

underscore就是一些函数的集合,大概分为6部分,分别是基础函数,集合,数组,函数,对象,实用功能. 在实现每一个功能的时候,基本上先自己实现,再对比. (function(){ }.call(this));基本框架长这样,就一个函数的自调用,用window作为调用对象,防止污染全局. //把window对象先存起来备用吧.var root = this;//弄个window的属性_:var previousUnderscore = root._;//存一些原型var ArrayProto

underscore.js源码解析(二)

前几天我对underscore.js的整体结构做了分析,今天我将针对underscore封装的方法进行具体的分析,代码的一些解释都写在了注释里,那么废话不多说进入今天的正文. 没看过上一篇的可以猛戳这里:underscore.js源码解析(一) underscore.js源码GitHub地址: https://github.com/jashkenas/underscore/blob/master/underscore.js 本文解析的underscore.js版本是1.8.3 _.each 1

Object类源码解析

本文的分析基于JDK 1.8 Java中所有的类都继承自Object类. Object类的源码解析 1.void registerNatives() private static native void registerNatives(); static { registerNatives(); } 1 2 3 4 5 1 2 3 4 5 该方法只是对几个本地方法进行注册(即初始化java方法映射到C的方法).需要注意的是,很多类中都有这个方法,但是执行注册的目标是不同的.System类中也有该

转:backbone.js源码解析:extend、Backbone.View

源:http://www.cnblogs.com/mxw09/archive/2012/07/06/2579329.html backbone版本:0.9.2 1.解析Backbone.Model(Collection | Router | View).extend (1).找到extend的定义 //定义extend函数  var extend = function (protoProps, classProps) {    /*    通常我们以Backbone.XXX.extend的方式建

String源码解析(一)

本篇文章内的方法介绍,在方法的上面的注释讲解的很清楚,这里只阐述一些要点. Java中的String类的定义如下: 1 public final class String 2 implements java.io.Serializable, Comparable<String>, CharSequence { ...} 可以看到,String是final的,而且继承了Serializable.Comparable和CharSequence接口. 正是因为这个特性,字符串对象可以被共享,例如下面

Flume-ng源码解析之Channel组件

如果还没看过Flume-ng源码解析之启动流程,可以点击Flume-ng源码解析之启动流程 查看 1 接口介绍 组件的分析顺序是按照上一篇中启动顺序来分析的,首先是Channel,然后是Sink,最后是Source,在开始看组件源码之前我们先来看一下两个重要的接口,一个是LifecycleAware ,另一个是NamedComponent 1.1 LifecycleAware @[email protected] interface LifecycleAware {  public void s

Handler机制(四)---Handler源码解析

Handler的主要用途有两个:(1).在将来的某个时刻执行消息或一个runnable,(2)把消息发送到消息队列. 主要依靠post(Runnable).postAtTime(Runnable, long).postDelayed(Runnable, long).sendEmptyMessage(int).sendMessage(Message).sendMessageAtTime(Message).sendMessageDelayed(Message, long)这些方法来来完成消息调度.p

Android EventBus源码解析, 带你深入理解EventBus

上一篇带大家初步了解了EventBus的使用方式,详见:Android EventBus实战 没听过你就out了,本篇博客将解析EventBus的源码,相信能够让大家深入理解该框架的实现,也能解决很多在使用中的疑问:为什么可以这么做?为什么这么做不好呢? 1.概述 一般使用EventBus的组件类,类似下面这种方式: [java] view plain copy public class SampleComponent extends Fragment { @Override public vo

Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例

概要  前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对LinkedList有个整体认识,然后再学习它的源码:最后再通过实例来学会使用LinkedList.内容包括:第1部分 LinkedList介绍第2部分 LinkedList数据结构第3部分 LinkedList源码解析(基于JDK1.6.0_45)第4部分 LinkedList遍历方式第5部分 LinkedL