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 はすべてのオブジェクトに適用でき、2 番目は String オブジェクトのみに限定されます。

4

2 に答える 2

1

どちらの場合も、Stringオブジェクトのみがtrim関数を取得します(つまり、最終結果は同じになります)。定義されているように、最初のコードは2番目のコードへの「ショートカット」にすぎません(最終的に、コードの長さと最初のメソッドを実装するための労力は2番目のメソッドとほぼ同じであるため、引用符で囲みます)。

于 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, ''); });

参照されているWebサイトで説明されているように、このコードは、オブジェクトのプロパティを反復処理するときにメソッドが適切に非表示になるようにします。また、メソッドがまだ存在しない場合にのみメソッドを追加します。

http://jsfiddle.net/jstoolsmith/nyeeB/を参照してください

于 2012-06-16T06:47:48.790 に答える