Fork me on GitHub
随笔 - 265  文章 - 0  评论 - 1075  阅读 - 230万

backbone的extend(0.9.2)

0.9.2版  原创,转载请标明 3Q....

1 var AppView = Backbone.View.extend({
2 
3 
4 
5 })
6 
7 console.log(AppView)

AppView是 Backbone.View 的一个视图模型子类,即AppView是父类返回的一个新的构造函数

源代码如下:

复制代码
  var extend = function(protoProps, staticProps) {
    var parent = this;
    var child;

    if (protoProps && protoProps.hasOwnProperty('constructor')) {
      child = protoProps.constructor;
    } else {
      child = function(){ parent.apply(this, arguments); };
    }

    _.extend(child, parent);

    ctor.prototype = parent.prototype;
    child.prototype = new ctor();

    if (protoProps) _.extend(child.prototype, protoProps);

    if (staticProps) _.extend(child, staticProps);

    child.prototype.constructor = child;

    child.__super__ = parent.prototype;

    return child;
  };

  Model.extend = Collection.extend = Router.extend = View.extend = extend;
复制代码

以上代码其实就是JS的原型继承,无非就是把 静态方法 与 原型方法克隆到 一个新的对象上

具体:

extend 函数中定义了3个参数

this 代表父类  parent

protoProps 实例属性

staticProps 静态属性

就上面例子而言就是 parent就是Backbone.ModelprotoProps 是传进去的{}对象,staticProps 还木定义

 

复制代码
 1    /**
 2      * 辅助工具
 3      * **/
 4 
 5     //共享空构造函数来帮助创建原型链。代理模式
 6     var ctor = function () {
 7     };
 8 
 9 // Helper function to correctly set up the prototype chain, for subclasses.
10 // Similar to `goog.inherits`, but uses a hash of prototype properties and
11 // class properties to be extended.
12     //parent, protoProps, staticProps
13     //父类,实例属性,静态属性
14     var inherits = function (parent, protoProps, staticProps) {
15         //构造的实例对象
16         var child;
17 
18         //判断protoProps是否一个原型对象(prototype),如果是则将child赋值为原型对象所属的构造函数
19         if (protoProps && protoProps.hasOwnProperty('constructor')) {
20             child = protoProps.constructor;
21         } else {
22             //当子类没有提供特定的constructor的时候,应该调用父类的。
23             /**
24              * 否则将新建一个构造函数赋值给child
25              * child = function () {}其实是要在new的时候才会
26              * 调用的,所以我们先假设我们设置的字段里面没有constructor,
27              * 所以当我们通过var temptA = new Tempt()的时候,
28              * 调用的是function () {Model.apply(temptA, arguments)},
29              * **/
30             child = function () {
31                 //inherits函数返回的是一个构造函数,我们会用new child()来调用此构造函数
32                 //(例如:AppView = Backbone.View.extend({});var appView=new AppView();),
33                 // 所以此处的this指向我们new的实例(例如var appView=new AppView(),则this指向appView)
34                 //new AppView进行的操作其实是Backbone.Model.apply(this,arguments) ,
35                 // 也就是说我们实例化appView的时候其实是调用Backbone.Model
36 
37                 //实例对象调用Backbone.Model
38                 parent.apply(this, arguments);
39             };
40         }
41 
42         //复制静态属性parent -> child ,模型的属性复制给实例对象
43         _.extend(child, parent);
44 
45         /**代理继承
46          * proxy来实现继承,这样就避免了在classical继承中出现的parent的constructor被使用两次带来
47          * 的效率问题和在原型链中再次继承this的属性
48          *  function obj (o){
49          *      var f = {}
50          *      f.prototype = o
51          *      return new f();
52          *  }
53          */
54             //ctor是一个内容为空的构造函数,此处将其原型对象设置为Backbone.View.prototype
55         ctor.prototype = parent.prototype;
56         //将child的原型对象设置为一个ctor的实例,child.prototype.contructor指向ctor
57         child.prototype = new ctor();
58 
59         /**
60          * 给新的类指定实例属性和静态属性的功能
61          * **/
62         //将Backbone.View.extend的第二个参数(一般是一个对象)的的所有属性复制到child.prototype
63         if (protoProps) _.extend(child.prototype, protoProps);
64 
65         //将Backbone.View.extend的第三个参数(一般是一个对象)的的所有属性复制到child,也就是给child设置静态属性或方法
66         if (staticProps) _.extend(child, staticProps);
67 
68         //执行完child.prototype=new ctor后,child.prototype.constructor已经不指向child,所以此处需要显示设置
69         child.prototype.constructor = child;
70 
71         //EcmaScript中并没有定义__super__这个属性,此处应该是backbone记录child对应的super类
72         child.__super__ = parent.prototype;
73 
74         return child;
75 
76         /**
77          *  new 自定义View等() 所属类--> child(用户创造的构造函数)
78          *  原型对象--> ctor的一个实例(我们自定义的一些函数和方法都设置到此实例上)
79          *  原型对象--> Backbon.View.prototype
80          * **/
81     };
复制代码

 

 

 

 

 

 

 

posted on   【艾伦】  阅读(2119)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
< 2012年8月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示