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

You may also like...