OpenLayers 项目分析[转](三):BaseTypes (续)

(三)BaseTypes: OpenLayers中定制JavaScript内置类

为了让更多的人看到这篇好文章,我把它转载到这里,这篇文章转载自http://www.3snews.net/html/24/10624-17454.html,原文作者如觉得不妥,可联系我删除之。

 

  OpenLayers不仅“自己”写了一些底层的类,像上回说的那些都是。同时也定制了一些JS的一些内置类,即对JS内置类的扩展。这个扩展主要包含3类:String,Number,Function,存在于BaseTypes.js文件中。

 

  String:

OpenLayers对string类型定制了8个方法,分别是startsWith、contains、trim和camelize;还有另外4个方法:String. startsWith、String. contains、String.trim和String. Camelize,它们将会在3.0Version中被删除,可能是以前版本遗留下来的,这里就不说它们了。

  //Test whether a string starts with another string. 

  startsWith: function(str, sub) {

    return (str.indexOf(sub) == 0);

    }

 

  //Test whether a string contains another string.

    contains: function(str, sub) {

        return (str.indexOf(sub) != -1);

    }

 

 

    //Removes leading and trailing whitespace characters from a string.

    trim: function(str) {

        return str.replace(/^/s*(.*?)/s*$/, “$1”);    

    }

 

 

   //Camel-case a hyphenated string.

  //Ex.”chicken-head”becomes”chickenHead”,

   //and”-chicken-head”becomes”ChickenHead”.

   // “骆驼”化带有连字符的字符串。

   camelize: function(str) {

        var oStringList = str.split(‘-‘);

        var camelizedString = oStringList[0];

        for (var i = 1; i < oStringList.length; i++) {

            var s = oStringList[i];

            camelizedString += s.charAt(0).toUpperCase() + s.substring(1);

        }

        return camelizedString;

    }

 

 

Number:

项目仅对number类型扩展了一个方法OpenLayers. Number. limitSigDigs(还有一个方法Number. limitSigDigs,同样在3.0中会删除)。

    //Limit the number of significant digits on an integer.

    limitSigDigs: function(num, sig) {

        var fig;

        if(sig > 0) {

            fig = parseFloat(num.toPrecision(sig));

        } else {

            fig = 0;

        }

        return fig;

    }

 

 

Function:

扩展了两个方法bind 和bindAsEventListener(同样存在Function.bind和Function. bindAsEventListener两个被“遗弃”的函数)。

    //Bind a function to an object.  

    //Method to easily create closures with’this’ altered.

    bind: function(func, object) {

        // create a reference to all arguments past the second one

        var args = Array.prototype.slice.apply(arguments, [2]);

        return function() {

            // Push on any additional arguments from the actual function call.

            // These will come after those sent to the bind call.

            var newArgs = args.concat(

                Array.prototype.slice.apply(arguments, [0])

            );

            return func.apply(object, newArgs);

        };

    }

 

 

    //Bind a function to an object, and configure it to receive the event

    //object as first parameter when called. 

    bindAsEventListener: function(func, object) {

        return function(event) {

            return func.call(object, event || window.event);

        };

    }

这里说说这两个方法。

首先看看bind方法,这是一个能够被Function的实例得到的方法,如下所示:

Function.prototype.bind = function() {

var _method = this, args = [], object = arguments[0];

for (var i = 1; i < arguments.length; i++)

args.push(arguments[i]);

return function(moreargs) {

for (var i = 0; i < arguments.length; i++)

args.push(arguments[i]);

return  _method.apply(object, args);

}

};

_method 代表Function实例自身,bind可接收多个参数,不过它绑定是是第一个参数,该参数是一个function或者是调用环境,后面的都是执行函数的参数。

 

Function.prototype.bindAsEventListener = function(object) {

var  _method = this;

return function(event) {

return  _method.call(object, event || window.event);

}

};

这里只是将object作为_method 引用的环境,就是说现在可以在object对象中这样使用,

object. _method (event||window.event)。

也许你注意到了Funtion扩展的两个方法一个用到了call而另一个用的是apply,其实这两个并没有什么太大的区别,只是参数传递的形式不同,如若没有参数要传递,那么这两个是一样的:

apply(obj[,argumentsArray]),call(obj[,arg1[,arg2…]])。


 

欢迎转载,请注明出处。

转载自:https://blog.csdn.net/suen/article/details/2415870

You may also like...