代码风格:
一、自执行匿名函数创建执行环境
var root = this; root保存全局执行环境的指针。浏览器端为window对象
二、依赖库
(1)、underscore 如果backbone的运行环境在服务端(nodeJs),则引入underscore库。
var _ = root._;
if (!_ && (typeof require !== 'undefined')) _ = require('underscore');
(2)、jQuery 
Backbone.$ = root.jQuery || root.Zepto || root.ender;
三、核心模块
Events、Model、Collection、View、Router、History
Events模块为JS对象,其他模块均为构造函数。Events对象扩展了Model.prototype、Collection.prototype、Router.prototype、View.prototype,因此这些模块的实例对象继承了Events对象的事件方法:on trigger等。
四、underscore的extend方法:_.extend 。用第2到第N个对象扩展第一个对象的属性。_extend(obj1, obj2,...,objn); 仅提供属性拷贝与覆盖的功能。注意事项:
业务层必须注意extend方法内部并没有判断第一个参数obj1是否为空,如果第一个参数为空,程序会报错,浏览器将捕获到该异常,JS代码将停止运行。
示例:
用Events对象与第三个参数对象扩展第一个参数对象Model.prototype 
五、重点讲一下backbone自己提供的extend方法。
通常我们在实际应用中并不满足new一个Backbone.Model 我们希望用自己提供的对象扩展backbone的model,这样我们new出来的实例,不仅继承了Backbone.Model的属性,也具备了完成具体业务操作的能力。backbone提供了extend方法来满足这样的应用场景。该方法放在源码的最下方。
看注释可知,凭借extend方法,我们可创建之类并设置正确的原型链。
(1)、方法支持传递两个参数:protoProps、staticProps 分别表示实例属性(扩展到原型上),类属性(扩展到构造函数上)
如上图:
实例属性(instance pros)必须通过语句:var indexRecommendModel = new Mpost.IndexRecommend.Model() 创建实例对象,然后通过indexRecommendModel.getRecommends(options)调用
类属性(class pros)可以直接这样调用:Mpost.IndexRecommend.Model.add() // 'i am a class Function!'
 
(2)、如果你传递进去的protoProps参数没有constructor属性,backbone将创建一个构造函数(匿名)并调用父类(通常为Backbone.Model等)的构造函数,这样当你new子类child的时候child实例就继承了父类的实例属性(如Backbone.Model实例属性:_changes、_events、attributes、_previousAttributes等)
 
(3)、子类的原型属性是构造函数Surrogate的实例对象,而Surrogate的原型指向了父类的原型(Backbone.Model.prototype):
var Surrogate = function(){ this.constructor = child; };
Surrogate.prototype = parent.prototype;
child.prototype = new Surrogate;
这样当你new子类的时候child实例的原型链就是这样的:
通过上图可知:
自定义的属性:apis、defaults、getRecommends、initialize等被添加到实例对象的原型对象Surrogate上,原型对象Surrogate也是一个实例对象,它的原型对象指向:Backbone.Model.prototype 下面我们看一下Backbone.Model.prototype都有哪些属性:
看源码可知:Backbone.Model.prototype除了包含核心的get、set等方法外,还包含Events模块的核心方法:on、trigger、off等
 
因此,当我们执行以下语句:
var indexRecommendModel = new Mpost.IndexRecommend.Model();
我们可以调用indexRecommendModel.on绑定自定义事件,调用indexRecommendModel.trigger触发事件(查找两次原型链)。
 
我们也可以调用扩展的实例属性indexRecommendModel.apis(查找一次原型链):
 
我们还可以直接调用扩展的类属性(静态属性)
Mpost.IndexRecommend.Model.add() // 'i am a class Function!' :

Backbone源码风格的更多相关文章

  1. Backbone源码分析(三)

    Backbone源码分析(一) Backbone源码分析(二) Backbone中主要的业务逻辑位于Model和Collection,上一篇介绍了Backbone中的Model,这篇文章中将主要探讨C ...

  2. Backbone源码解读(一)事件模块

    Backbone源码浅读: 前言: Backbone是早起的js前端MV*框架之一,是一个依赖于underscore和jquery的轻量级框架,虽然underscore中基于字符串拼接的模板引擎相比如 ...

  3. 【 js 基础 】【 源码学习 】backbone 源码阅读(一)

    最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-stud ...

  4. 【 js 基础 】【 源码学习 】backbone 源码阅读(二)

    最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(source-code-study)进行参考交流,有详细的源码注释,以及知识总结,同时 ...

  5. 【 js 基础 】【 源码学习 】backbone 源码阅读(三)浅谈 REST 和 CRUD

    最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-stud ...

  6. 【 js 基础 】【 源码学习 】backbone 源码阅读(三)

    最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-stud ...

  7. Backbone源码解析(六):观察者模式应用

    卤煮在大概一年前写过backbone的源码分析,里面讲的是对一些backbone框架的方法的讲解.这几天重新看了几遍backbone的源码,才发现之前对于它的理解不够深入,只关注了它的一些部分的细节和 ...

  8. Backbone源码学习之extend

    extend函数在backbone大概就20来行代码包括注释,对学习Javascript中"类"的继承很是好的学习资料. 下面先贴出Backbone中的源码,其中涉及到unders ...

  9. Backbone源码分析(二)

    在传统MVC框架模式中,Model承担业务逻辑的任务.Backbone作为一个mvc框架,主要的业务逻辑交由Model与Collection来实现.Model代表领域对象,今天主要学一下Model源码 ...

随机推荐

  1. Centos6.5_64位系统下安装Oracle 11g

    一.硬件要求 1.内存与Sweap:内存2G(以上),Sweap 2G(以上) 内存: 1-2G 2-16G 16G以上 Sweap: 1.5倍内存 1倍内存 16G 检查:# grep MemTot ...

  2. [51nod1058]求N!的长度

    法1:stirling公式近似 $n! \approx \sqrt {2\pi n} {(\frac{n}{e})^n}$ (如果怕n不够大下式不成立,可以当数小于10000时用for求阶层) 也可以 ...

  3. datanode与namenode的通信原理

    在分析DataNode时, 因为DataNode上保存的是数据块, 因此DataNode主要是对数据块进行操作. **A. DataNode的主要工作流程:** 1. 客户端和DataNode的通信: ...

  4. 2、misa统计SRR结果

    参考: https://www.sogou.com/link?url=hedJjaC291NYNxVe4xgB4c3bUxXRMqZrT93cntTAgYfyBbRAdP9kIA.. https:// ...

  5. 【机器学习】关联规则分析(一):Apriori

    一.Apriori原理 Apriori是关联分析中较早的一种方法,主要用来挖掘那些频繁项集合,其思想是: 1.如果一个项目集合不是频繁集合,那么任何包含它的项目(超集)也一定不是频繁集. 2.如果一个 ...

  6. MVC5手工添加System.Web.Optimization

    VS2012web手工添辑一个空的mvC5的项目,添加EF6的支持,在别的项目里复制了母版页_Layout.cshtml过来,发现Styles.Render未引用,这个引用使用的命名空间是System ...

  7. C++内存管理之unique_ptr

    一个unique_ptr"拥有“他所指向的对象.与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定的对象.当unique_ptr被销毁时,它所指向的对象也被销毁. ...

  8. cinder介绍及使用lvm本地存储

    1.cinder简介 Cinder提供持久的块存储,目前仅供给虚拟机挂载使用.它并没有实现对块设备的管理和实际服务,而是为后端不同的存储结构提供了统一的接口,不同的块设备服务厂商在 Cinder 中实 ...

  9. 如何使用ROS查找rgbdslam代码包框架的输入

    我想这是一个天大的错误,在没有对整个ROS下的代码有一个整体理性的认知时,我使用感性认知. 由于在跑他的测试代码时,只替换了两个节点的名称,相当于remap了它,以为就可以跑了,结果是不行的. 然后用 ...

  10. Unity Shader着色器优化

    https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247493518&idx=1&sn=c51b92e9300bcf ...