- 主题:終于搞懂了 Ext.extend,記一筆
一直用自己的工具方法而不是 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
啧啧一下
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 一直用自己的工具方法而不是 Ext.extend 来扩展 Ext 的类型
: 刚刚终于碰上出问题的了
: 也总算借此搞明白了 Ext.extend 里那个一直不懂的 F 是起什麽作用的。
: ...................
--
FROM 125.33.177.*
orz
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 一直用自己的工具方法而不是 Ext.extend 来扩展 Ext 的类型
: 刚刚终于碰上出问题的了
: 也总算借此搞明白了 Ext.extend 里那个一直不懂的 F 是起什麽作用的。
: ...................
--
FROM 221.219.10.*
分析得好。(我本来想用感叹号的,怕被引起情绪激动的怀疑,改用句号)
说句题外话,我的子类要是也想在构造过程里做点私事怎么办呢?
通过一个函数返回一个类的构造器的办法也是不好的,我说的是类似 Ext.extend 的做法。
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 一直用自己的工具方法而不是 Ext.extend 来扩展 Ext 的类型
: 刚刚终于碰上出问题的了
: 也总算借此搞明白了 Ext.extend 里那个一直不懂的 F 是起什麽作用的。
: ...................
--
FROM 222.76.228.*
哦,我工具包裏完整的 extendClass 大致是這樣子的……
var extendClass = function (base, constructor, overrides) {
....
var clazz =
function () {
var self = this;
this.supr = function () { base.apply(self, arguments); };
constructor.apply(this, arguments);
this.supr = undefined; };
....
return clazz;
};
然後子類這樣寫即可:
var clazz = extendClass(base, function () { this.supr(...); });
限制是只能調用一次 supr....不過好像也夠用了
【 在 modico (modico) 的大作中提到: 】
: 分析得好。(我本来想用感叹号的,怕被引起情绪激动的怀疑,改用句号)
汗,我錯了……
: 说句题外话,我的子类要是也想在构造过程里做点私事怎么办呢?
: 通过一个函数返回一个类的构造器的办法也是不好的,我说的是类似 Ext.extend 的做法。
: ...................
--
FROM 221.221.150.101