当前位置: 首页 > news >正文

Openerp js代码分析 继承部分

为什么80%的码农都做不了架构师?>>>   hot3.png

openerp js代码比较精妙,所有的操作,数据请求,展现都通过js完成。
js里面充分运用了面向对象的思维,继承什么的用得比较多。
我们分析了一下代码,root object 类
corelib.js
instance.web.Class类,这个类相当于所有使用继承关系的父类,继承关系在这个类里面实现。
如:
instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerMixin, {})
formview就通过调用extend的继承instance.web.View.
这些类的继承关系如下,
instance.web.FormView–>instance.web.View->instance.web.Widget–>instance.web.Controller–>instance.web.Class
Events–>instance.web.Class
instance.web.Registry–>instance.web.Class
instance.web.JsonRPC–>instance.web.Class
instance.web.CrashManager–>instance.web.Class
instance.web.Bus–>instance.web.Class
instance.web.TranslationDataBase–>instance.web.Class
还有不少类继承instance.web.Class,自己搜代码吧。
参考corelib.js

instance.web.Class.extend = function() { var _super = this.prototype; var args = _.toArray(arguments); //参数转换为数组 args.unshift({}); var prop = _.extend.apply(_,args); //参考underscore文档,这个是把args的属性都转到prop变量上。 initializing = true; var prototype = new this(); //建立用来存放对象方法,属性的变量。 initializing = false; for (var name in prop) { //遍历args里面的属性,函数,如果对象存在函数,就保存到this._super里面去 prototype[name] = typeof prop[name] == "function" && fnTest.test(prop[name]) ? (function(name, fn) { return function() { var tmp = this._super; this._super = _super[name]; var ret = fn.apply(this, arguments); this._super = tmp; return ret; }; })(name, prop[name]) : prop[name]; }

后面,Class.prototype = prototype;
这样就完成了对象继承。

function Class() { if (!initializing && this.init) { var ret = this.init.apply(this, arguments); if (ret) { return ret; } } } Class.constructor = Class;

这个里面实现了类的构造函数,这玩意实际不能继承,但是他会调用init函数,达到那个效果
init函数也就充当了子类的构造函数的工作。
一个代码例子:

var Person = instance.web.Class.extend({ init: function(isDancing){ this.dancing = isDancing; }, dance: function(){ return this.dancing; } });

感觉openerp里面的js模仿了不少backbone.js的功能,同时也使用了,underscore
并且较多的使用,$.Deferred()对象,这个得参考,

http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html

其实这个代码也还是不复杂。

转载于:https://my.oschina.net/gotham/blog/156343

相关文章:

  • php全面获取url地址栏及各种参数
  • poj2679
  • 数据映射–有序数组
  • JavaScript prototype
  • json相关
  • 《SQL With ties 的理解 与 》
  • undefined reference to 问题解决方法。
  • 防火墙iptables之基础语法
  • xen虚拟化实战系列(十一)之xen虚拟机磁盘文件挂载
  • 文本处理工具------awk
  • Action属性注入值和指定Struts 2处理的请求
  • Java多线程感悟二
  • linux下乱码问题的终极解决方法
  • 【原】ios下比较完美的单例模式,已验证
  • 希望我们的婚姻,纯粹因为爱情
  • 【RocksDB】TransactionDB源码分析
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • CSS 专业技巧
  • ES6系统学习----从Apollo Client看解构赋值
  • Hibernate【inverse和cascade属性】知识要点
  • iOS 系统授权开发
  • mysql中InnoDB引擎中页的概念
  • PHP面试之三:MySQL数据库
  • Redash本地开发环境搭建
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • windows下如何用phpstorm同步测试服务器
  • 阿里云Kubernetes容器服务上体验Knative
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 主流的CSS水平和垂直居中技术大全
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 阿里云移动端播放器高级功能介绍
  • 如何用纯 CSS 创作一个货车 loader
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (八十八)VFL语言初步 - 实现布局
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)计算机毕业设计高校学生选课系统
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十三)Maven插件解析运行机制
  • (四)图像的%2线性拉伸
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • ***利用Ms05002溢出找“肉鸡
  • .NET CLR Hosting 简介
  • .NET Core引入性能分析引导优化
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 的字符串暂存池
  • .NET6 开发一个检查某些状态持续多长时间的类