2011-07-29 33 views
22

我正在閱讀道格拉斯克羅克福德的JavaScript:好部件,我對某事有些困惑。在第4章的擴充類型下,他創建了添加方法的快捷方式。在JavaScript中增加類型

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

他說:

通過與「法」的方法增強Function.prototype的,我們不再 必須鍵入原型屬性的名稱。現在可以隱藏這個醜點 。

然後,他繼續用這個來爲這個數字原型添加一個'整數'方法。

Number.method('integer', function() { 
    return Math[this < 0 ? 'ceil' : 'floor'](this); 
}); 

document.writeln((-10/3).integer()); // -3 

我有點困惑在這裏...因爲我們增加了一個「方法」方法將功能樣機,數量不限原型。據我所知,Number對象不會從函數原型繼承(雖然也許我錯了)。我看到這是有效的,但我不明白爲什麼Number對象能夠使用這個'method'方法來添加...方法。

+0

這是一個很酷的問題。我花了一段時間才明白代碼,但我終於明白了。 – Paul

+0

感謝所有的好答案。現在有道理。 –

+2

我的問題的後續是第一個代碼點。我想我不明白他的報價。這種「方法」方法如何比直接將方法直接添加到Number原型更高效或更好?像這樣:Number.prototype.integer = function(){ return Math [this <0? 'ceil':'floor'](this); } –

回答

4

Number實際上是一個功能。任何構造函數都是一個函數。

想一想javascript中的類型的一種方法是說一個類型只是一個函數Foo,它具有.prototype屬性。這是使用關鍵字new創建的任何對象的原型,如new Foo()。按照慣例,Foo用大寫字母表示它是一個構造函數。

2

下面是一個例子,可以幫助:

​​

思考它的另一種方式是,在Javascript Function拉動雙重任務爲類類型 - 類型的類型。因此這是爲類型添加一個方法。

+1

'alert(num instanceof Number);'這個是'false'。 – ChandlerQ

+0

@AmareKnight:呃......廢話。這是Java中我不需要的一個「特性」。 –

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

那麼在此語句塊中,你已經創建了一個方法調用的方法是通過原型繼承的所有對象進行訪問。函數派生自派生自Object.prototype的Function.prototype。因此,在此聲明中,字符串和數字將能夠訪問名爲method的Object.prototype方法。

Number.method('integer', function() { 
    return Math[this < 0 ? 'ceil' : 'floor'](this); 
    }); 

document.writeln((-10/3).integer()); // -3 

在該第二塊你基本上調用一個是在對象原型已經可用的方法和傳遞所要求的參數在此情況下名=「整數」和值等於

function() { 
    return Math[this < 0 ? 'ceil' : 'floor'](this); 
    }); 

最後在最後的聲明中,您傳遞名稱值對的結果爲-3