//创建一个类,相当于java中的class定义一个类
OpenLayers.Class = function() {
//这个Class作为一个匿名函数返回,其构造函数中会调用initalize()函数
var Class = function() {
if (arguments && arguments[0] != OpenLayers.Class.isPrototype) {
this.initialize.apply(this, arguments);
}
};
//这个是Class的prototype所指向的对象
var extended = {};
//parent是父类,initialize是父类的initialize方法
var parent, initialize;
//循环参数列表
for(var i=0, len=arguments.length; i<len; ++i) {
if(typeof arguments[i] == "function") {
//如果第一参数是function类型,则说明第一参数是父类
if(i == 0 && len > 1) {
//下面几行代码挺绕的,其实就是子类在继承父类的时候不想调用父类的initialize方法。因为只要继承父类的其他属性就行了,至于initialize方法自己可以覆盖,然后调用父类的initialize方法。
initialize = arguments[i].prototype.initialize;
arguments[i].prototype.initialize = function() {};
extended = new arguments[i];
if(initialize === undefined) {
delete arguments[i].prototype.initialize;
} else {
arguments[i].prototype.initialize = initialize;
}
}
//如果是函数类型,但不是第一个参数,则把函数的prototype所指向的对象赋给parent
parent = arguments[i].prototype;
} else {
//这个是对象啦,直接赋值就行了
parent = arguments[i];
}
//来个浅拷贝,齐活!
OpenLayers.Util.extend(extended, parent);
}
//把Class函数对象的prototype指向这个extended对象,这样在以后谁new这个Class函数对象的时候,其原型自动指向extended对象。
Class.prototype = extended;
//返回这个Class函数对象,这样这个函数名就不叫Class了,你起的是啥名字就叫啥。自此一个类就定义出来了!
return Class;
};
//下面的这些函数都过时了,3.0删除
OpenLayers.Class.isPrototype = function () {};
OpenLayers.Class.create = function() {
return function() {
if (arguments && arguments[0] != OpenLayers.Class.isPrototype) {
this.initialize.apply(this, arguments);
}
};
};
OpenLayers.Class.inherit = function () {
var superClass = arguments[0];
var proto = new superClass(OpenLayers.Class.isPrototype);
for (var i=1, len=arguments.length; i<len; i++) {
if (typeof arguments[i] == "function") {
var mixin = arguments[i];
arguments[i] = new mixin(OpenLayers.Class.isPrototype);
}
OpenLayers.Util.extend(proto, arguments[i]);
}
return proto;
};
出处:http://blog.csdn.net/baozhifei/archive/2009/08/15/4450571.aspx