Javascript - 看起来我的JS库没有加载,但我正确地链接了它们



我有两个包含三个静态方法的库,在将库加载在一起后,urlFrag无法识别为函数。但是,当我简单地在主脚本中对函数进行编码时,程序会识别它们。

    <script type="text/javascript" src="arrayLib.js"></script>
    <script type="text/javascript" src="strLib.js"></script>
    <script type="text/javascript">

        var url = "http://www.ora.com:80/goodparts?q#fragment";
        try {
            var results = String.urlFrag(url);
            String.displayURLParts(results);
        }
        catch (err)
        {
            console.log('Error name: ' + err.name + ' Error message: ' + err.message);
        }   

在 ArrayLib 中.js

// verify if the object is an array
   Array.isArray = Array.isArray || function (value) { 
      'use strict';
      return value &&
      typeof value === 'object' &&
      typeof value.length === 'number' &&
      typeof value.splice === 'function' &&
      !(value.propertyIsEnumerable('length'));
   };

在strLib内部.js

// fragments a url in
// scheme: 
// slash: 
// host: 
// port: 
// path: 
// query: 
// hash: 
String.urlFrag = String.urlFrag || function(url)
{
    'use strict';
    if(typeof url !== 'string') 
    { 
       throw {
         name: 'TypeError', 
         message: 'url is not a string'
        } 
    }   
  var parse_url = /^(?:([A-Za-z]+):)?(/{0,3})([0-9.-A-Za-z]+)(?::(d+))?(?:/([^?#]*))?(?:?([^#]*))?(?:#(.*))?$/;
  var result = parse_url.exec(url);
   return result;
 };  

 // display the URL parts
 // depends on arrayLib.js
 String.displayURLParts = String.displayURLParts || function(parts)
 {
    'use strict';
    if(!Array.isArray(parts)) 
    { 
      throw {
        name: 'TypeError', 
        message: 'parts is not a string'
      } 
    } 
    var blanks = '   '; 
    var names = ['url', 'scheme', 'slash', 'host', 'port', 'path', 'query', 'hash'];  
    for(var i = 0; i < names.length; i++) 
    { 
       document.writeln(names[i] + ':' + blanks.substring(names[i].length) + parts[i] +                              
       '<br>');                                                                                 
    } 
  }
我不知道

如何很好地解释这一点......

我写了两个方法:

// make the prototype use unnecessary
Function.prototype.method = function(name, func)
{
    'use strict';
    if(!this.prototype[name])
    {
      this.prototype[name] = func;
    } 
 };
   // deentityifies entities
   String.method('deentityify', function() {
           'use strict';
           var entity = {
                quot: '"',
                lt: '<',
                gt: '>'
            };
            return function() {
                return this.replace(/&([^&;]+);/g,
                        function(a, b) {
                            var r = entity[b];
                            return typeof r === 'string' ? r : a;
                        });
            };
        }()); 

第二个如您所见,是 String 对象的"原型",不知何故与 urlParts 冲突。神奇的是,我用 Function.method 替换了 String.method 中的字符串,并放入另一个文件(即 objLib.js),然后程序就可以工作了。

    // deentityifies entities
    Function.method('deentityify', function() {
       'use strict';
       var entity = {
            quot: '"',
            lt: '<',
            gt: '>'
        };
        return function() {
            return this.replace(/&([^&;]+);/g,
                    function(a, b) {
                        var r = entity[b];
                        return typeof r === 'string' ? r : a;
                    });
        };
    }());