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.Model , protoProps 是传进去的{}对象,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     };
复制代码

 

 

 

 

 本文转自艾伦 Aaron博客园博客,原文链接:http://www.cnblogs.com/aaronjs/archive/2012/08/26/2657103.html,如需转载请自行联系原作者

相关文章
|
12月前
|
前端开发
Layui 内置方法 - layer.load(加载层)
Layui 内置方法 - layer.load(加载层)
1318 0
|
2月前
|
TensorFlow 算法框架/工具
【Tensorflow】解决A `Concatenate` layer should be called on a list of at least 2 inputs
在TensorFlow 2.0中,使用Concatenate函数时出现错误,可以通过替换为tf.concat 来解决。
24 4
|
数据采集 PyTorch 数据处理
从DETR backbone 的NestedTensor 到DataLoader, Sampler,collate_fn,再到DETR transformer
从DETR backbone 的NestedTensor 到DataLoader, Sampler,collate_fn,再到DETR transformer
218 0
|
数据可视化 计算机视觉
Backbone | What?没有Normalize也可以起飞?全新Backbone之NF-ResNet(文末获取论文与源码)
Backbone | What?没有Normalize也可以起飞?全新Backbone之NF-ResNet(文末获取论文与源码)
83 1
|
存储 测试技术
测试模型时,为什么要with torch.no_grad(),为什么要model.eval(),如何使用with torch.no_grad(),model.eval(),同时使用还是只用其中之一
在测试模型时,我们通常使用with torch.no_grad()和model.eval()这两个方法来确保模型在评估过程中的正确性和效率。
856 0
|
机器学习/深度学习 PyTorch 算法框架/工具
model是一个模型网络,model.eval() 、model.train()是什么意思?
在PyTorch中,model.eval()是一个模型对象的方法,用于将模型设置为评估模式。当模型处于评估模式时,它会在前向传递期间禁用某些操作,如丢弃(dropout)和批量归一化(batch normalization),以确保模型的输出稳定性。
879 0
Backbone - create model的实现原理
Created by Wang, Jerry, last modified on May 29, 2016
134 0
Backbone - create model的实现原理
|
TensorFlow 算法框架/工具
成功解决AttributeError: module 'tensorflow.nn.rnn_cell' has no attribute 'linear'
成功解决AttributeError: module 'tensorflow.nn.rnn_cell' has no attribute 'linear'
|
存储 JavaScript 前端开发
|
存储 JavaScript 前端开发