实施:1
Function.prototype.method = function (name,func){
this.prototype[name] = func;
return this;
};
String.method('trim', function(){
return this.replace(/^\s+|\s+$/g, '');
});
实施:2
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
}
1和2之间有什么区别吗?除了1可以应用于所有对象,第二只限于String对象。
答案 0 :(得分:1)
在这两种情况下,只有String对象将获得trim
函数(即最终结果将是相同的)。第一个代码,如定义的,只是第二个代码的“快捷方式”(我把它放在引号中,因为最后,代码长度和实现第一个方法的努力与第二个方法大致相同)。
答案 1 :(得分:0)
适用于现代浏览器的更强大,更通用的解决方案:
!Object.implement && Object.defineProperty (Object.prototype, 'implement', {
// based on http://www.websanova.com/tutorials/javascript/extending-javascript-the-right-way
value: function (mthd, fnc, cfg) { // adds fnc to prototype under name mthd
if (typeof mthd === 'function') { // find mthd from function source
cfg = fnc, fnc = mthd;
(mthd = (fnc.toString ().match (/^function\s+([a-z$_][\w$]+)/i) || [0, ''])[1]);
}
mthd && !this.prototype[mthd] &&
Object.defineProperty (this.prototype, mthd, {configurable: !!cfg, value: fnc, enumerable: false});
}
});
// Allows you to do
String.implement (function trim () { return this.replace(/^\s+|\s+$/g, ''); });
如引用的网站中所述,此代码确保在迭代对象属性时正确隐藏方法。如果还没有方法,它也只会添加方法。