我有两个包含三个静态方法的库,在将库加载在一起后,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;
});
};
}());