日期:2014-05-16 浏览次数:20458 次
//开发一个任务系统,我们需要抽象出一个类来表示任务,对应的,
//每个任务都可能会有一个监听器,当任务执行之后,需要通知监听器。
//监听器的类
var EventListener = Base.extend({
constructor : function(sense){
this.sense =sense;
},
sense : null,
handle : function(){
logs(this.sense+" occured");
}
});
//任务类
var Task = Base.extend({
constructor : function(name){
this.name = name;
},
name : null,
listener : null,
execute : function(){
logs(this.name);
this.listener.handle();
},
setListener : function(listener){
this.listener = listener;
}
});
//创建类的方式很简单,需要给 Base.extend 方法传入一个 JSON 对象
//方法访问自身的成员时需要加 this 关键字
var pri = new Task("定时任务1");
var priListen = new EventListener("监听器1");
pri.setListener(priListen);
pri.execute();
//打印如下:
//定时任务1
//监听器1 occured
?
var Base = function() {};
Base.prototype = {
extend : function(source) {
if (arguments.length > 1) {
var ancestor = this[source];
var value = arguments[1];
if (typeof value == "function" && ancestor
&& /\bbase\b/.test(value)) {
var method = value;
value = function() {
var previous = this.base;
this.base = ancestor;
var returnValue = method.apply(this, arguments);
this.base = previous;
return returnValue;
};
value.method = method;
value.ancestor = ancestor;
}
this[source] = value;
} else if (source) {
var extend = Base.prototype.extend;
if (Base._prototyping) {
var key, i = 0, members = ["constructor", "toString", "valueOf"];
while (key = members[i++]) {
if (source[key] != Object.prototype[key]) {
extend.call(this, key, source[key]);
}
}
} else if (typeof this != "function") {
extend = this.extend || extend;
}
for (key in source)
if (!Object.prototype[key]) {
extend.call(this, key, source[key]);
}
}
return this;
},
base : Base
};
Base.extend = function(_instance, _static) {
var extend = Base.prototype.extend;
Base._prototyping = true;
var proto = new this;
extend.call(proto, _instance);
delete Base._prototyping;
var constructor = proto.constructor;
var klass = proto.constructor = function() {
if (!Base._prototyping) {
if (this._constructing || this.constructor == klass) {
this._constructing = true;
constructor.apply(this, arguments);
delete this._constructing;
}
else {
var object = arguments[0];
if (object != null) {
(object.extend || extend).call(object, proto);
}
return object;
}
}
};
for (var i in Base) {
klass[i] = this[i];
}
klass.ancestor = this;
klass.base = Base.base;
klass.prototype = proto;
klass.toString = this.toString;
extend.call(klass, _static);
if (typeof klass.init == "function")
klass.init();
return klass;
};
Base = Base.extend({
constructor : function() {
this.extend(arguments[0]);
}
},
{
ancestor : Object,
base : Base,
implement : function(_interface) {
if (typeof _interface == "function") {
_interface(this.prototype);
} else {
this.prototype.extend(_interface);
}
return this;
}
});