2013-07-03 32 views
4

我猜大部分你已經看到了下面的代碼片段:的Javascript:function.prototype.method

Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

我也知道,這將影響到所有的功能,因爲它們是由函數創建的所有對象,使他們能命名訪問方法「方法」,但是我很困惑,爲什麼功能本身也還可以訪問「方法」像以下:因爲新的功能,使用該函數的原型,功能的方法是使用自己的原型方法太

Function.method('test', function() {return 1;}); 

回答

6

Edorka的回答是正確的:函數是它自己的構造函數(即「父」)。

Function.constructor; // function Function() { [native code] } 

通常你不能你在做什麼。例如,這是不行的:

f = function() {}; 
f.prototype.a = 5; 
f.a; // undefined 

這種事情只有當你使用函數作爲一個構造函數,像這樣的工作:

f = function() {}; 
f.prototype.a = 5; 
g = new f(); 
g.a; // 5 

但功能是奇怪的,它是構造函數對於所有功能而言也是一種功能本身,所以它將其屬性模板自己的原型。因此,您可以在代碼中調用Function.method()

1

如果您修改這些方法或屬性之一,並且它屬於「父」原型,則使用此原型的所有其他對象都將受到影響。

一些識字與這個陌生的主題:http://www.packtpub.com/article/using-prototype-property-in-javascript

+2

其中最先出現的是函數對象還是函數原型? – zerkms

+0

原型,如果對象本身無法得到de方法或屬性,如果問它它的原型,或原型的原型.... – Edorka

+0

我只是想'函數本身,它應該是Object的對象,因此它會只查找Object的原型而不是'Function本身。 –

1

考慮下面的構造函數對象:

var Construct = function() { }; 

與原型共享功能:

Construct.prototype.hello = function (name) { console.log("Hello " + name); }; 

現在,如果你創建一個new對象從構造函數中獲取共享成員函數:

var c = new Construct(); 
c.hello("World"); 

同爲cinstanceof Construct Object,也任何

  • functioninstanceof Functioninstanceof Object
  • Function本身是instanceof FunctionObject
  • Constructinstanceof Function Object並且還
  • Objectinstanceof Function Object

每個function聲明和運算符是一個本地文本new Function
每個{ }文字是本機new Object

創建對象newconstructor得到constructor.prototype的成員。
對象可以擁有任何成員,只有原型成員可以共享。

+0

我只是想'Function本身,它應該是Object的對象,因此它只會查找Object的原型而不是'Function本身。 –

+0

@ user2546240它是。不要混淆typeof的結果。只是嘗試instanceof。因爲typeof是一個字符串,所以它不能同時說出函數和對象。 instanceof更準確,因爲它知道函數是Function的對象和Object的對象。 – metadings

5

因爲Function本身就是一個功能:

typeof Function === 'function' 
Object.getPrototypeOf(Function) === Function.prototype 

而且你可以看到它被稱爲函數(間接eval形式):

Function('return 1+2')() === 3 

所有這些定義in the spec

zerkms問a comment above

是先 - 函數對象或函數原型?

我們必須明白,暴露給我們的東西,弱小的程序員,與內部所代表的不同。這可以通過重寫Array構造舉例說明(提示:在寫一個答案不要嘗試這個,你會得到很多錯誤):

new Array(0, 1, 2); //gives you [0, 1, 2] 
Array = function() { return [4] }; 
new Array(0, 1, 2); //gives you [4] 
//however, 
[0, 1, 2] //will always give you [0, 1, 2] 

這是因爲a section in the spec(有點下來,的「語義」部分):

令陣列是彷彿由表達式new Array()其中Array是標準內置具有該名稱的構造創建一個新對象的結果。

使用數組文本(如規範要求,或數組初始化)你確保您使用內置數組構造

我爲什麼給這個例子?首先,因爲這是一個有趣的例子。其次,說明我們做什麼和實際做了什麼是不同的。爲了回答zerkms,Function對象很可能是第一個,但這不是第一個函數。我們無法訪問該內置功能。

+0

「zerkms問道」---它實際上是一個笑話,指的是「雞與蛋」問題:-) – zerkms

+1

@zerkms當然,在這種情況下,雞實際上是由更有情感的人帶給我們的。現在問題永遠解決了? – Zirak

相關問題