一直用自己的工具方法而不是 Ext.extend 来扩展 Ext 的类型
刚刚终于碰上出问题的了
也总算借此搞明白了 Ext.extend 里那个一直不懂的 F 是起什麽作用的。
小记一笔:
Ext.extend 里面那个替身类 F 全部的作用
就是在生成子类原型对象的过程中跳过原父类的构造方法
以便等到实例化子类的时候再带参数执行。原理如下:
在 js 中基於一父类型 base 扩展子类型 clazz,需要达到三个目的:
1. 要让 clazz 继承 base 原型中的所有成员
2. 要求 clazz 的实例 obj 满足 obj instanceof base
3. 要能在 clazz 的实例化中使用 base 的构造函数
爲此一个一般的写法是:
var extendClass =
function (base) {
var clazz = function () { base.apply(this, arguments); };
clazz.prototype = new base();
return clazz;
};
通过设置 clazz.prototype 为 base 的实例来满足 1,2
通过 base.apply(this) 来满足 3
但是,如果 base 的构造函数不能无参数执行的话,new base() 就要出错了
(Ext.tree.TreePanel 正是这麽一个类)
Ext.extend 解决方案的原理在於
爲了满足 1,2 的条件,其实并不需要 clazz 的原型是 base 的实例——
实际上只需要 "clazz 的原型的原型" 和 "base 的原型" 相同就可以了。
而 base 自己的构造函数可以留到 base.apply(this) 那里再去执行。
爲此,创建一个 base 的替身类 standin
让它和 base 拥有相同的原型,并给它一个空的构造函数:
var extendClass =
function (base) {
var standin = function () { };
standin.prototype = base.prototype;
var clazz = function () { base.apply(this, arguments); };
clazz.prototype = new standin();
return clazz;
};
这个 standin 就是 Ext.extend 里面的 F
--
修改:withinsea FROM 221.221.161.171
FROM 221.221.161.171