V-1.8.2 underscore源码解析(一)

5 篇文章 0 订阅
5 篇文章 0 订阅

V-1.8.2 underscore源码解析(一)

第一次看源码,可能废话有点多,有很多不足的地方,请指出和谅解。
我是先看hanzichi大神的github, 在结合自己的想法写的,想看大神的点这里https://github.com/hanzichi/underscore-analysis
将window命名为root变量
var root = this;

声明一个变量previousUnderscore,将root._ 保存到这个变量上
var previousUnderscore = root._;

将数组,对象,函数的原型以及一些原型方法保存为对应的变量,便于之后调用
var ArrayProto = Array.prototype,
ObjProto = Object.prototype,
FuncProto = Function.prototype;
var push = ArrayProto.push,
slice = ArrayProto.slice,
toString = ObjProto.toString,
hasOwnproperty = ObjProto.hasOwnProperty;

hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性
obj.hasOwnProperty(prop);
prop:要检测的属性 ‘字符串 名称’或者 Symbol。

将es5的一些方法保存到各自对应的变量 

var nativeIsArray = Array.isArray,
nativeKeys = Object.keys,
nativeBind = FuncProto.bind,
nativeCreate = Object.create;

Object.create(proto[,propertiesObject ])是es5新提出一个一种对象创建方式,第一个参数是要继承的原型,如果不是一个子函数,可以传入一个null,第二个参数是对象的属性描述符,是可选的。

Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组;
如果传入的是一个对象,则返回一个有key值构成的数组
var obj= {name:’tom’,sex:’men’,age:23};
Object.keys(obj); 返回值 [“name”, “sex”, “age”]

如果返回的是一个类数组对象 ,有可能返回的是一个有随机key值字符串构成的数组;
类数组 对象, 随机 key 排序 ;
let anObj = { 100: ‘a’, 2: ‘b’, 7: ‘c’ };
console.log(Object.keys(anObj)); [‘2’, ‘7’, ‘100’];

如果传入的是一个数组,则返回的是一个有索引值字符串构成的数组
let arr = [1,3,4];
Object.keys(arr); 返回值为[“0”, “1”, “2”];

如果传入的是一个字符串,则返回的是一个有索引值字符串构成的数组
Object.keys(‘飞机额外’); 返回值 [“0”, “1”, “2”, “3”]

如果传入的是number类型或布尔类型或null或undefined,均会返回一个空数组

var Ctor = function() {};
创建一个构造函数,便于以后调用

var _ = function(obj) {
if(obj instanceof _) {
return obj;
};
if(!(this instanceof _)) {
return new _(obj);
};
this._wrapped = obj;
};

如果obj是 _ 的实例,则返回obj,不是则执行下一个if语句,!(this instanceof _ )为true,返回一个实例_(obj),此时 this指向当前实例,是 _ 的一个实例,this instanceof _ 为true,则给这个实力添加_wrapperd这个属性;
这里有点绕,执行一遍就明了了
var obj; (obj)默认为undefined;
_(obj);
此时obj不是 _ 的实例,所以执行第二个if语句,此时this指向window,!(this instanceof _)为true,所以返回一个new _(obj);
由于_(obj)是执行语句,相当于new _ (obj)();需要再执行一遍,obj依然不是 _ 的实例,执行下一个if语句,此时this指向当前实例,即new _(obj);是 _ 的实例, !(this instanceof _ )为false,则执行下一步,this._wrapped = obj;
所以_(); 默认返回一个_ {_wrapped: undefined}的属性;
如果_(“tom”),则会返回一个_ {_wrapped: “tom”};
说了这么多,这个方法的目的就是创建一个安全引用的underscore对象;同时确保 _ 上带有_wrapped的属性存储obj

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值