avalon.js源码解析

简介

avalon是国内 司徒正美 写的MVVM框架,相比同类框架它的特点是:

使用 observe 模式,性能高。

将原始对象用object.defineProperty重写,不需要用户像用knockout时那样显示定义各种属性。

对低版本的IE使用了VBScript来兼容,一直兼容到IE6。

需要看基础介绍的话建议直接看司徒的博客。在网上搜了一圈,发现已经有了avalon很好的源码分析,这里也推荐一下:地址。 avalon在圈子里一直被诟病不够规范的问题,请各位不必再留言在我这里,看源码无非是取其精华去其糟粕。可以点评,但总是讨论用哪个框架好哪个不好就没什么意义了,若是自己把握不住,用什么都不好。

今天的分析以 avalon.mobile 1.2.5 为准,avalon.mobile 是专门为高级浏览器准备的,不兼容IE8以下。

入口

还是先看启动代码

avalon.ready(function() {
    avalon.define("box", function(vm) {
        vm.w = 100;
        vm.h = 100;
        vm.area = function(){
            get : function(){ return this.w * this.h }
        }
        vm.logW =function(){ console.log(vm.w)}

    })
    avalon.scan()
})

还是两件事:定义viewModel 和 执行扫描。 翻到define 定义:

avalon.define = function(id, factory) {
        if (VMODELS[id]) {
            log("warning: " + id + " 已经存在于avalon.vmodels中")
        }
        var scope = {
            $watch: noop
        }
        factory(scope) //得到所有定义
        var model = modelFactory(scope) //偷天换日,将scope换为model
        stopRepeatAssign = true
        factory(model)
        stopRepeatAssign = false
        model.$id = id
        return VMODELS[id] = model
    }

其实已经可以一眼看明白了。这里只提一点,为什么要执行两次factory?建议读者先自己想一下。我这里直接说出来了: 因为modelFactory中,如果属性是函数,就会被直接复制到新的model上,但函数内的vm却仍然指向的原来的定义函数的中的vm,因此发生错误。所以通过二次执行factory来修正引用错误。

那为什么不在modelFactory中直接就把通过Function.bind或其他方法来把引用给指定好呢?而且可以在通过scope获得定以后就直接把 scope 对象修改成viewModel就好了啊?

这里的代码写法其实是直接从avalon兼容IE的完整版中搬出来的,因为对老浏览器要创造VBScript对象,所以只能先传个scope进去获取定义,在根据定义去创造。并且老的浏览器也不支持bind等方法。 还是老规矩,我们先看看整体机制图:

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mvvm框架的avalon
, function
, ie源码
, model
, if ie代码不好用
, Factory
, scope
, avalon
, function.bind
, avalon绑定属性
, knockout源码
, 直接
, avalon.js教程
avalon过滤器
vue.js源码解析、sea.js源码解析、js源码解析、angularjs源码解析、reactjs 源码解析,以便于您获取更多的相关知识。

时间: 2024-12-30 08:50:50

avalon.js源码解析的相关文章

knockout.js源码解析

简介 本文主要对源码和内部机制做较深如的分析,基础部分请参阅官网文档. knockout.js (以下简称 ko )是最早将 MVVM 引入到前端的重要功臣之一.目前版本已更新到 3 .相比同类主要有特点有: 双工绑定基于 observe 模式,性能高. 插件和扩展机制非常完善,无论在数据层还是展现层都能满足各种复杂的需求. 向下支持到IE6 文档.测试完备,社区较活跃. 入口 以下分析都将对照 github 上3.x的版本.有一点需要先了解:ko 使用 google closure compi

Redux系列x:源码解析

写在前面 redux的源码很简洁,除了applyMiddleware比较绕难以理解外,大部分还是 这里假设读者对redux有一定了解,就不科普redux的概念和API啥的啦,这部分建议直接看官方文档. 此外,源码解析的中文批注版已上传至github,可点击查看.本文相关示例代码,可点击查看. 源码解析概览 将redux下载下来,然后看下他的目录结构. npm install redux 这里我们需要关心的主要是src目录,源码解析需要关心的文件都在这里面了 index.js:redux主文件,主

Step.js 使用教程(附源码解析)

Step.js(https://github.com/creationix/step)是控制流程工具(大小仅 150 行代码),解决回调嵌套层次过多等问题.适用于读文件.查询数据库等回调函数相互依赖,或者分别获取内容最后组合数据返回等应用情景.异步执行简单地可以分为"串行执行"和"并行"执行,下面我们分别去看看. 串行执行 这个库只有一个方法 Step(fns...).Step 方法其参数 fns 允许是多个函数,这些函数被依次执行.Step 利用 this 对象指

VasSonic源码解析

H5很重要,H5很重要,H5很重要,重要的事情要说三遍.VasSonic是腾讯开源的解决H5首屏渲染痛点的开源项目,本文通过解读代码来学习WebView的优化思路. H5的优劣 H5的优势很明显,跨平台.迭代快.开发体验好.H5的劣势同样明显,加载慢,用户体验差.业内大牛想尽各种方法来弥补H5的劣势,初级使用缓存.预加载等常用方案,高级如Hybrid.ReactNative.Weex等H5的进阶解决方案.VasSonic专注于H5的秒开,使用的也是我们常见的性能优化方案.本文尝试了解VasSon

Vue.js源码(2):初探List Rendering

下面例子来自官网,虽然看上去就比Hello World多了一个v-for,但是内部多了好多的处理过程.但是这就是框架,只给你留下最美妙的东西,让生活变得简单. <div id="mountNode">      <ul>          <li v-for="todo in todos">            {{ todo.text }}          </li>      </ul>  <

Redux入坑进阶之源码解析

预热 redux 函数内部包含了大量柯里化函数以及代码组合思想 柯里化函数(curry) 通俗的来讲,可以用一句话概括柯里化函数:返回函数的函数 // example  const funcA = (a) => {    return const funcB = (b) => {      return a + b    }  };   上述的funcA函数接收一个参数,并返回同样接收一个参数的funcB函数. 柯里化函数有什么好处呢? 避免了给一个函数传入大量的参数--我们可以通过柯里化来构

AngularJS动态生成div的ID源码解析_AngularJS

1.问题背景 给定一个数组对象,里面是div的id:循环生成div元素,并给id赋值 2.实现源码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>AngularJS动态生成div的ID</title> <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angula

加密-C#爬虫调用js源码想获取QQ空间get命令的p字段 出现以下问题

问题描述 C#爬虫调用js源码想获取QQ空间get命令的p字段 出现以下问题 我从登录页面下了个c_login_2.js文件,结果用MSScriptControl.ScriptControl出现各种问题,主要就是各种未定义,例如 windows未定义 document未定义 解决方案 那当然,你得放在webbrowser里面运行才行,否则这些和浏览器相关的对象都没有.

Java集合学习(十七) TreeSet详细介绍(源码解析)和使用示例

这一章,我们对TreeSet进行学习. 我们先对TreeSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeSet. 第1部分 TreeSet介绍 TreeSet简介 TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet<E>, Cloneable, java.io.Serializable接口. TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法.