zoukankan      html  css  js  c++  java
  • uunderscore源码阅读笔记

    hello world:
      蕾迪生 and 捷特闷:
      第一次写博客 目的是为了记录自己学习的痕迹 自娱自乐 有点小小的激动。写的烂 轻拍!!!
      第一次看库的源码 选择underscore库 这个库听说比较简单 作为一名初级前端的首选阅读库 不知道是不是真的 废话还是少说 跟我一起来 看看源码吧!!!
     
    作为underscore工具库的 开始部分有两个地方让我产生了困惑 有点让我费解!思考良久 也参考了别人的 意见 :
    第一个地方是这个函数:
    var optimizeCb = function(func, context, argCount) {
      if (context === void 0) {
        return func;
      }
      switch (argCount == null ? 3 : argCount) {
        case 1:
          return function(value) {
          return func.call(context, value);
        };
        case 2:
          return function(value, other) {
          return func.call(context, value, other);
        };
        case 3:
          return function(value, index, collection) {
          return func.call(context, value, index, collection);
        };
        case 4:
          return function(accumulator, value, index, collection) {
          func.call(context, accumulator, value, index, collection);
        };
      }
     
      // 其实可以在这里一次解决  
      return function() {
        return func.apply(context, arguments);
      };
    };

    为什么 最后可以用apply解决的事情 还要在前面 写一堆switch case 然后里面用call来调用了    因为: call 比 apply要快

    .apply 在运行前要对作为参数的数组进行一系列检验和深拷贝,.call 则没有这些步骤
     
    第二个地方是 :
    // 用于原型转换使用
    var Ctor = function(){};
    // 用于创建 新对象
    var baseCreate = function(prototype){
      // 如果prototype 参数不是对象 直接返回一个空对象
      if (!_.isObject(prototype)) return {};

      // 如果浏览器支持es5 Object.create
      if (nativeCreate) return nativeCreate(prototype);

      Ctor.prototype = prototype;
      var result = new Ctor;
      Ctor.prototype = null; // 这里注意了 虽然Ctor.prototype 重置为null 。result实例对象的 proto还是指向 原来的那个原型对象 所以一样能调用原来原型对象的方法
      return result;
    };
     
     
    当一个类 new 出这个类的实例化对象后 再重置这个类的原型对象  前面new 出来的实例对象 还是指向的是 原来的 那个原型对象 所以这里 有两点需要注意:
    1. 实例对象 无法调用新的原型对象上的方法。
    2.这里可以 做一个优化 把不用的原型对象置为null  从而释放内存。 
  • 相关阅读:
    Hadoop and net core a match made in docker
    JavaScript封装方法,兼容参数类型为Number和String
    HTML的input类型为hidden导致无法reset改字段的value问题
    MyBatis自动生成Java/C#的Bean(Entity)的等价MYSQL实现函数
    JMX configuration for Tomcat
    Resolved validation conflict with readonly
    FreeMarker example all in one
    Notepad++ 大小写转换
    常用编辑器列模式快捷键
    Redis应用一例(存证数量用计数器实现)
  • 原文地址:https://www.cnblogs.com/hfdj/p/7482112.html
Copyright © 2011-2022 走看看