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 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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 开源的文件压缩处理库,助力快速实现文件压缩解压功能!