属性肯定指向的是Object,不是指向的Observable,这岂不是存在bug,我通过代码检测发现
alert(Ext.util.Observable.prototype.constructor == Ext.util.Observable);
的结果确实又是true,怎么回事呢?答案就在Ext.extend的那段防御性代码,大家回过去看看吧!
现在我们写一个继承Obervable的类,不过不是UI组件,而是一个领域模型,比如论坛帖子,它在被修改之后会跑出一个被修改的事件,监听器捕获这个事件将修改保存到数据库中,代码如下:
ForumThread = Ext.extend(Ext.util.Observable, {
constructor: function(config) {
this.name = config.name;
//把监听器放进超类的属性
this.listeners = config.listeners;
this.events = {"change" : true};
//给领域模型设置事件,通过上面的写法也可以
/* this.addEvents({
"change" : true
});*/
//调用超类构造超类不变量
ForumThread.superclass.constructor.call(this, config)
},
//领域行为,会触发事件
changeName : function(newName) {
alert("原主题名字是:" + this.name);
this.name = newName;
alert("更改后主题名字是:" + this.name);
this.fireEvent("change", this);//触发事件
}
});
Ext.onReady(function() {
var forumThread = new ForumThread({
name : '关于将Jdon框架提升为DCI框架的设想',
//构造领域模型时注入监听处理程序
listeners : {
change : function(thread) {
alert('接受到事件,将异步保存新的名字:' + thread.name);
}
}
});
//领域行为调用
forumThread.changeName("关于将Jdon框架提升为DCI框架的设想,整合JdonMVC");
});
摘自 Adley