2012-06-16 74 views
2
  • 實現:1在JavaScript Function.prototype的和Object.prototype中的區別

    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對象。

回答

1

在這兩種情況下,只有String對象會得到trim函數(即最終結果將是相同的)。定義的第一個代碼只是第二個代碼的「捷徑」(我把它放在引號中,因爲最終代碼長度和實現第一個方法的努力與第二個方法大致相同)。

現代瀏覽器
+0

謝謝你的幫忙! – R2D2

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/

+0

謝謝你的幫助。 – R2D2

相關問題