2013-10-13 54 views
1

我正在嘗試「Java Script Good Part」一書中的示例之一。找到下面的代碼。擴大類型,找不到的方法

它引發一個錯誤,說Number沒有方法的整數。你能幫我理解這個問題嗎?

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

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

運行上面的代碼後,將其附加一個方法整數Number.prototype

Number.prototype.integer 

它顯示功能。

Number.integer 

它說未定義。

Number.integer(10); 

我得到的 - 號(){[本地代碼]}有沒有方法 '整'

我不知道我要去的地方錯了。

我試過用ceil替換天花板。它仍然不起作用。

+4

_「我試圖通過與小區更換天花板」 _ - 這不是主要的問題,但你一定要做出的改變,「小區」是正確的方法名。 – nnnnnn

+1

難道你不應該把它叫做'(3.14).integer()'嗎? – thgaskell

回答

1

您要添加的方法分配給Number實例原型,你不將它添加到Number函數本身。

所以要使用它,請撥打實例Number,如下所示:Live Example | Live Source

var n = 3.1415; 
var i = n.integer(); 
console.log("i = " + i); // "i = 3" 

或用數字文字:Live Example | Live Source

console.log(3.1415.integer()); // "3" 
console.log((3).integer()); // "3" 

注意,在上面的第二行,我只好把它自己的3在括號;否則,JavaScript解析器認爲.是小數點而不是屬性存取器。


備註:擴展具有可枚舉屬性的預定義類型的原型可能有點危險。當人們延長NumberString時,我從來沒有看到任何重大問題,但如果您擴展ArrayObject,則存在主要問題,所以我會遠離這樣做。


邊注2:在我上面的例子,我也糾正Math.ceil名稱(這是ceil,不ceiling)。

+0

謝謝。我知道了。我需要創建一個Number的實例,以便使用附加到原型的方法,而不是Number函數本身。 – Santosh

1

method功能(這是從Javascript拍攝好的部分)其中添加到Function原型幫助你定義在某一類的方法或類型,以便該類型的所有實例或對象繼承方法。在你的代碼

兩個問題:

  1. 要調用integer就好像在類或構造函數Number本身,這是不是這樣的定義,它是對Number原型定義。如果函數實際上是對Number本身定義的,它會一直這樣定義的:

    Number.integer = function() { /* Implementation */ }; 
    
  2. 您將參數傳遞給函數(即Number.integer(10),雖然你AREN的函數體沒有處理這個數字,也沒有聲明integer函數接受任何參數。我想你很困惑,這個數字正在被this關鍵字在函數內引用,但這是不正確的。

method功能允許您定義在一個給定類型的方法,你可以從它像這樣受益:

var a = 10.3; // Now a is a Number instance and so it inherits the integer() method 
console.log(a.integer()); // call the method on a 

你甚至可以直接調用它的文字,他們將被自動換行通過翻譯,像這樣:

console.log((32.543).integer()); 
+0

謝謝。我知道了。我需要創建一個Number的實例,以便使用附加到原型的方法,而不是Number函數本身。 – Santosh

+0

@SantoshMarigowda好的,不用客氣。 –