Openerp js代码分析 继承部分

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

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

你可能感兴趣的:(Openerp js代码分析 继承部分)