2010-01-24 79 views
15

有沒有方法可以在不使用原型庫的情況下爲所有javascript函數添加方法?javascript將原型方法添加到所有函數中?

東西沿着線:

Function.prototype.methodName = function(){ 


    return dowhateverto(this) 

}; 

這是我試過到目前爲止,但它沒有工作。也許這是一個壞主意,如果可以,請告訴我爲什麼?

如果是的話我可以把它添加到一組函數我選擇

類似:

MyFunctions.prototype.methodName = function(){ 


    return dowhateverto(this) 

}; 

其中MyFunctions是函數名的數組

謝謝

+0

http://www.packtpub.com/article/using-prototype-property-in-javascript – jjj 2010-01-24 11:39:23

+1

擴展內置的JavaScript對象是不好的做法。 – jerone 2010-01-24 12:14:28

回答

25

當然。函數是對象:

var foo = function() {}; 

Function.prototype.bar = function() { 
    alert("bar"); 
}; 

foo.bar(); 

會提醒「酒吧」

+0

這段代碼假設'foo'已經被聲明過了,否則'foo'是一個隱含的全局變量(bad!)。也許把聲明語句改成'var foo = function(){};'以強化好的練習......? – 2010-04-18 07:19:32

+0

那麼,首先修改基礎對象的原型並不完美。但我同意。 – troelskn 2010-04-18 16:26:40

1
function one(){ 
    alert(1); 
} 
function two(){ 
    alert(2); 
} 

var myFunctionNames = ["one", "two"]; 

for(var i=0; i<myFunctionNames.length; i++) { 
    // reference the window object, 
    // since the functions 'one' and 'two are in global scope 
    Function.prototype[myFunctionNames[i]] = window[myFunctionNames[i]]; 
} 


function foo(){} 

foo.two(); // will alert 2 
1

更改JS內置對象可以給你一些驚喜。
如果您添加外部庫或更改其中一個的版本,則您不能確定它們不會覆蓋您的擴展。

+0

您的鏈接已死亡。 – luckydonald 2015-11-02 13:35:27

+0

@luckydonald,感謝您的評論 – Mic 2015-11-02 15:25:24

1

嘗試Object.prototype中,而不是:

Object.prototype.methodName = function(){ 

    return dowhateverto(this) 
}; 

但也聽從警告,擴展本地對象並不總是一個好主意。

Function.prototype不能在Javascript中可靠地操作;它不是一個真正的對象,因爲Function()構造函數需要返回一個函數,而不是一個對象。但是,你不能像正常的功能那樣對待它。當您嘗試訪問其「屬性」時,其行爲可能未定義,並且在瀏覽器之間有所不同。另見this question

相關問題