2
  • 实施: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 可以应用于所有对象,而 2nd 仅限于 String 对象。

4

2 回答 2

1

在这两种情况下,只有 String 对象将获得该trim函数(即最终结果将是相同的)。正如定义的那样,第一个代码只是第二个代码的“快捷方式”(我把它放在引号中,因为最后,代码长度和实现第一种方法的努力与第二种方法大致相同)。

于 2012-06-16T00:27:49.473 回答
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, ''); });

如引用的网站中所述,此代码确保在迭代对象属性时正确隐藏该方法。如果一个方法不存在,它也只会添加该方法。

http://jsfiddle.net/jstoolsmith/nyeeB/

于 2012-06-16T06:47:48.790 回答