文档章节

AvalonJS 源码分析之二

ali安东尼
 ali安东尼
发布于 2017/09/07 15:28
字数 1040
阅读 4
收藏 0
点赞 0
评论 0

上次主要讲解了avalon的整体框架,以及其模块加载器,那么接下来我们将一步一步讲解接下来的参数(注入)依赖部分,今天使用的源码跟上次分析的一样也是2.16版本。

整体内容介绍:

从我们上一次最后讲解的部分开始,也就是从代码63行到结束,我们所讲的参数(注入)依赖部分是以一个数组的形式引入的,从开始到结束一共有80个模块,这样可以直接以数组下标去直接引入我们所需要的模块。

    例如 :webpack_require(0); 这里直接加载模块一,也是直接返回我们最终一个的avalon对象

分析一:模块一 和模块二 

  代码从65到100行,这里都是加载avalon所必须的一些模块,

       例如:webpack_require(2);

  我们暂时先忽略掉这一块,或者等以后再回过头来看这一模块的内容

分析二:模块三

  代码从102到300行,作者也做了备注说明此模块是用于修复语言的底层缺陷,例如:

      if (!'司徒正美'.trim) {             var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g             String.prototype.trim = function () {                 return this.replace(rtrim, '')             }         }   首先判断String是否存在trim的函数,如不存在就将自定义一个trim 并将其添加到String类的prototype(原型对象)中,目的是为了兼容 ie7/8 不支持trim。        Object.keys = function (object) { //ecma262v5 15.2.3.14             var theKeys = []             var skipProto = hasProtoEnumBug && typeof object === 'function'             if (typeof object === 'string' || (object && object.callee)) {                 for (var i = 0; i < object.length; ++i) {                     theKeys.push(String(i))                 }             } else {                 for (var name in object) {                     if (!(skipProto && name === 'prototype') &&                             ohasOwn.call(object, name)) {                         theKeys.push(String(name))                     }                 }             }

            if (hasDontEnumBug) {                 var ctor = object.constructor,                         skipConstructor = ctor && ctor.prototype === object                 for (var j = 0; j < dontEnumsLength; j++) {                     var dontEnum = dontEnums[j]                     if (!(skipConstructor && dontEnum === 'constructor') && ohasOwn.call(object, dontEnum)) {                         theKeys.push(dontEnum)                     }                 }             }             return theKeys         }

Object.keys()是javascript的一个函数,这个函数返回对象的可枚举属性和方法的名称,是不收集继承自原型链上的,但在IE8下Object的一系列属性是不可遍历的,所以进行改进。在实现的同时,通过对

     dontEnums = ['toString','toLocaleString','valueOf','hasOwnProperty','isPrototypeOf','propertyIsEnumerable','constructor'];

的遍历,去判断继承于原形链上的几个属性是否被重新改写,如被重新改写,则将其返回,修复其对原型链的不兼容。          function iterator(vars, body, ret) {         var fun = 'for(var '+vars+'i=0,n = this.length;i < n;i++){'+             body.replace('', 'fn.call(scope,this[i],i,this)')             +'}'+ret         return new Function("fn,scope",fun);     }     //迭代操作,将数组的元素挨个儿传入一个函数中执行。Prototype.js的对应名字为each。     forEach: iterator('', '', ''),     //迭代类 在数组中的每个项上运行一个函数,如果此函数的值为真,则此元素作为新数组的元素收集起来,并返回新数组     filter: iterator('r=[],j=0,', 'if()r[j++]=this[i]', 'return r'),     //收集操作,将数组的元素挨个儿传入一个函数中执行,然后把它们的返回值组成一个新数组返回。Prototype.js的对应名字为collect。     map: iterator('r=[],', 'r[i]=', 'return r'),     //只要数组中有一个元素满足条件(放进给定函数返回true),那么它就返回true。Prototype.js的对应名字为any。     some: iterator('', 'if()return true', 'return false'),     //只有数组中的元素都满足条件(放进给定函数返回true),它才返回true。Prototype.js的对应名字为all。     every: iterator('', 'if(!)return false', 'return true') 该模块中也对Array的迭代器进行了重写,在上面的例子中,iterator() 有三个参数 - 要调用的函数和传递给该函数的参数。而Function 类可以表示开发者定义的任何函数。用 Function创建函数类时,前面的都是函数参数,只有最后一个参数是函数主体(要执行的代码) 注意:尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作 Function 类的实例。

这一章就先写到这里,下一篇将会继续分析avalon的各个模块。

由睿江云人员提供,想了解更多,请登陆www.eflycloud.com

© 著作权归作者所有

共有 人打赏支持
ali安东尼
粉丝 3
博文 192
码字总数 173101
作品 0
广州
avalonjs 中的if else实现的几种方法

在学习avalonjs的过程中,发现模板中并没有if else这样的写法,不像tempalte ejs这些,所以总结了三种方法来实现,仅供在使用avalonjs的同学参考,主要是通过ms-if 表达式和方法来实现. 1.开始前的...

subying ⋅ 2015/10/05 ⋅ 1

源码之下无秘密 ── 做最好的 Netty 源码分析教程

背景 在工作中, 虽然我经常使用到 Netty 库, 但是很多时候对 Netty 的一些概念还是处于知其然, 不知其所以然的状态, 因此就萌生了学习 Netty 源码的想法. 刚开始看源码的时候, 自然是比较痛苦...

永顺 ⋅ 2017/11/29 ⋅ 0

国内优秀Android学习资源

技术博客 应用开发 博主 博客 备注 任玉刚 CSDN博客 深入Android应用开发,深度与广度兼顾 郭霖 CSDN博客 内容实用,行文流畅,高人气博主 夏安明 CSDN博客 张鸿洋 CSDN博客 自定义View系列非...

程序袁_绪龙 ⋅ 2016/05/24 ⋅ 0

avalonJS-源码阅读(一)

写angularJS源码阅读系列的时候,写的太垃圾了。一个月后看,真心不忍直视,以后有机会的话得重写。这次写avalonJS,希望能在代码架构层面多些一点,少上源码、多写思路。 avalon暴露句柄方式...

lost_o0 ⋅ 2014/04/30 ⋅ 0

国内优秀Android学习资源汇总全集

本博文将基于https://github.com/bboyfeiyu/android-tech-frontier/tree/master/the-bad-guys 进行扩展和补充,欢迎各位朋友一起补充 欢迎加入移动互联网QQ群讨论,群号:285077071 应用开发...

kinbos ⋅ 2015/05/23 ⋅ 0

avalonJS-源码阅读(前)

avalon模块加载 avalon自己实现了一套可被替换的模块加载系统(AMD loader)。具体什么是AMD loader可参看doJo官方博客关于AMD loader的翻译讲解,看完之后,再继续往下看,会比较清楚些。 ...

lost_o0 ⋅ 2014/05/02 ⋅ 0

avalonJS-源码阅读(二)

avalon页面处理(2) 上一篇文章讲述的avalon刷页面所用到的几个函数。这篇则是主要讲avalon对刷DOM刷出来的avalon自定义属性如何处理的。 数据结构 看js代码最头疼的就是数据流转时的数据结...

lost_o0 ⋅ 2014/05/03 ⋅ 1

javascript资料收集

JavaScript: 谈谈 JavaScript 异步编程:http://web.jobbole.com/81747/ Google JavaScript 规范:http://docs.kissyui.com/1.4/docs/html/tutorials/style-guide/google-js-style.html Co......

Mr_Tank_ ⋅ 2014/12/18 ⋅ 0

Android系统的Binder机制之三——服务代理对象(2)

文《Android系统的Binder机制之二——服务代理对象(1)》我们学习了进程的C/C++层面的服务代理对象BpBinder,和Binder底层处理方式。本文我们将深入分析一下在进程的Java层面服务代理对象的...

垂盆草 ⋅ 2012/08/04 ⋅ 0

avalon框架学习

[详细api][1] avalon特性 双向绑定,方便编程 比angular兼容性好 体积小巧、跟适合移动端 [1]: http://avalonjs.github.io 目前发现的小问题 自带的加载器支持格式有限,比如 require(【】,...

snecker ⋅ 2015/03/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

金山WPS发布了Linux WPS Office

导读 近日,金山WPS发布了Linux WPS Office中文社区版新版本,支持大部分主流Linux系统,功能更加完善,兼容性、稳定性大幅度提升。本次更新WPS将首次在Linux提供专业办公文件云存储服务,实...

问题终结者 ⋅ 昨天 ⋅ 0

springboot2输出metrics到influxdb

序 本文主要研究一下如何将springboot2的metrics输出到influxdb maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

go4it ⋅ 昨天 ⋅ 0

微信小程序 - 选择图片显示操作菜单

之前我分享过选择图片这个文章,但是我在实际开发测试使用中发现一个问题在使用 wx.chooseImage 选择照片显示出第一格是拍照,后面是相册里的图片。这种实现之前说过了,效果如下。 但是你从...

hello_hp ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部