OpenLayers 2 源码解读(2) Class.js
js中并没有所谓的命名空间概念,所谓的命名空间就是通过js对象的属性来模拟实现的。
ol2的顶级命名空间就是OpenLayers,可以在SingleFile.js中看到,所以说,这个文件的加载顺序一定是在最前面。
Class.js 中定义了ol2的采用的继承关系是如何实现的
//定义了所有的继承关系实现方式,通过调用OpenLayers.Class方法,来实现对象的继承
OpenLayers.Class = function() {
//定义了所有的对象实现,传入的第一个参数为父对象,最后一个参数为该类的实现
var len = arguments.length;
var P = arguments[0];
var F = arguments[len-1];
//定义子类的构造函数名称initialize
//新建对象时,首先会执行initialize方法;如果没有的话,则执行父对象的initialize方法,沿着这个链向上寻找,知道找到,当然顶级的对象,必须有定义initialize方法
var C = typeof F.initialize == "function" ?
F.initialize :
function(){ P.prototype.initialize.apply(this, arguments); };
if (len > 1) {
//实现子对象能够访问父对象的属性及方法
var newArgs = [C, P].concat(
Array.prototype.slice.call(arguments).slice(1, len-1), F);
OpenLayers.inherit.apply(null, newArgs);
} else {
//返回的对象的原型指向自定义的对象(最后一个参数)
C.prototype = F;
}
return C;
};
//如果值是function类型的,则通过原型链的方式指向,否则通过对象“指针地址”(可能表述不太准确)的方式,指向同一块内存(js中所有的类型都是对象)
OpenLayers.inherit = function(C, P) {
var F = function() {};
F.prototype = P.prototype;
C.prototype = new F;
var i, l, o;
for(i=2, l=arguments.length; i<l; i++) {
o = arguments[i];
if(typeof o === "function") {
o = o.prototype;
}
OpenLayers.Util.extend(C.prototype, o);
}
};
ps:对javascript的原型继承prototype也是一知半解,自行参考资料
转载自:https://blog.csdn.net/u010468602/article/details/51833973