转载 Ext.extend用法(ext的继承)
来源:互联网 发布:人工智能医疗概念股 编辑:程序博客网 时间:2024/05/16 05:17
Ext.extend用法(ext的继承)收藏
概述
Ext.extend是Ext的继承机制,这个函数的代码相当难懂。要明白这个函数的代码,首先要知道这个函数如何使用。
使用方式
使用示例
假设有个function名为SuperClass,要实现一个子类,名为MyClass。下面的两种方式都可以实现这个功能。
下面来个具体示例:
一个错误例子
下面看个示例:
可以去执行一下,可以发现f1的执行结果仍然是"f1 in base"。并没有真正的达到override的效果。
也就是说:第三个参数里面的函数被放置在了子类的prototype中。
而在ChildClass.superclass.constructor.call(this);这句上,BaseClass的f1成了ChildClass的变量,而不是ChildClass.prototype。通过对JavaScript的原型继承的了解,可以知道,实例变量的优先级是高于prototype的,所以上面的这个代码是达不到override的功能的。
修改的方式如下:
代码解读
JavaScript中的继承实现
先了解一下最简单的继承是如何实现的:
以看到最简单的继承只做了两件事情,一是把subFn的prototype设置为superFn的一个实例,然后设置subFn.prototype.constructor为subFn。
Ext.extend的代码
Ext.extend函数中用到了Ext.override,这个函数把第二个参数中的所有对象复制到第一个对象的prototype中。首先贴上Ext.override函数的代码:
- Ext.override = function(origclass, overrides){
- if(overrides){
- var p = origclass.prototype;
- for(var method in overrides){
- p[method] = overrides[method];
- }
- }
- }
然后贴上Ext.extend的代码:
代码中进行了太多的简写,看起来不是特别方便,把代码中的简写补全,代码如下:
- function extend(){
- // inline overrides
- var inlineOverride = function(o){
- for (var m in o) {
- this[m] = o[m];
- }
- };
- return function(subFn, superFn, overrides){
- if (typeof superFn == 'object') {
- //如果subFn也是对象的话(一般来说subFn这里放的是父类的构造函数),那么第三个参数overrides参数相当于被忽略掉
- overrides = superFn;
- superFn = subFn;
- //subFn重新定义了函数
- subFn = function(){
- superFn.apply(this, arguments);
- };
- }
- var F = function(){
- }, subFnPrototype, superFnPrototype = superFn.prototype;
- F.prototype = superFnPrototype;
- subFnPrototype = subFn.prototype = new F();
- subFnPrototype.constructor = subFn;
- subFn.superclass = superFnPrototype;
- if (superFnPrototype.constructor == Object.prototype.constructor) {
- superFnPrototype.constructor = superFn;
- }
- subFn.override = function(obj){
- Ext.override(subFn, obj);
- };
- subFnPrototype.override = inlineOverride;
- Ext.override(subFn, overrides);
- return subFn;
- };
- };
补全以后也不是特别容易明白,那么我们就把这个代码分开,分为2个参数和3个参数。
两个参数的Ext.extend代码
首先把代码改写成两个参数的。
从注释中可以看到,做的工作很简单,只是定义一个subFn函数,这个函数中会调用superFn函数。定义了subFn以后,就使用上面的最简单的继承方式实现继承。然后为subFn和subFn的prototype添加了一个override函数。最后的Ext.override(subFn, overrides);把overrides中的函数写入subFn的prototype中。
三个参数的Ext.extend代码
下面我们把函数改写为只处理3个参数的,改写后的代码如下:
过程与两个参数的时候相差无几,只是两个参数的时候,subFn时重新定义的一个function,而三个参数的时候,这个步骤就省略了。
总结及说明
这样大家就对这个函数很明白了吧,也可以知道Ext.extend的继承只会覆写构造函数prototype中的对象,使用的时候需要多加注意。
注意下面一段代码
- if (superFnPrototype.constructor == Object.prototype.constructor) {
- superFnPrototype.constructor = superFn;
- }
这段代码我在改写的Ext.extend中省略掉了。原因在于我尝试了多次,发现参数为两个参数的时候,只有第一个参数为Object对象或者为3个参数的时候,第二个参数为Object才会进入此段代码。
但是发现superFn也时function Object(){},在IE和FF下都是如此。那么我就不是很清楚这段代码到底是什么用的了,若有清楚的,告诉一声,哈。
- 转载 Ext.extend用法(ext的继承)
- Ext的extend继承
- Ext的extend继承1
- Ext的extend继承1
- Javascript的继承和Ext的Extend
- 犀利的继承-再看Ext.extend
- JavaScript和ExtJS的继承 Ext.extend Ext.applyIf
- extjs的Ext.extend的使用样例(Ext继承)
- Ext.extend 从继承说起
- Ext Js的extend
- ExtJS学习------Ext.define的继承extend,用javascript实现类似Ext的继承
- Ext.extend()
- Ext.extend
- Ext源码分析源码分析之Ext的继承模式解说——第三节、分析Ext.extend
- 阅读Ext 学习Javascript(二)Core/Ext.extend 从继承说起
- 阅读Ext 学习Javascript(二)Core/Ext.extend 从继承说起
- 阅读Ext 学习Javascript(二)Core/Ext.extend 从继承说起
- 转载:《仔仔细细分析Ext》 第一章 必须理解Ext.extend函数
- 【排障】解决在一例在安装Office 2007 SP2时发生挂起的错误
- [转]ExtJs里使用FckEditor
- 如何在页面中插入播放器
- ExtJs2.0学习系列(11)--Ext.XTemplate
- html文件包含文件的几种方法
- 转载 Ext.extend用法(ext的继承)
- 在线播放器代码博客播放器代码大全
- UDP网络传输丢包分析
- 常用网页播放器代码
- asp自定义fckeditor上传文件的文件名
- Expert Oracle Database Architecture
- 嵌入式linux移植vsftpd服务器
- LAMP
- 40种网页常用小技巧--JavaScript