2012-04-19 87 views
-4

我有這樣的功能:改變的價值「這一」

Number.prototype.f=function() 
{ 
    this=2;//This is not working 
} 
var x=0; 
x.f(); 
alert(a);//Here I want that x equal 2 

而且我想x是2底!

+1

這將是很好的解釋_爲什麼你需要這樣做。可能有更好的方法。 – drnewman 2012-04-19 13:39:32

回答

2

你不能這樣做,確切的說,但你可以通過顯式使用數構造函數和重寫toString方法得到類似的效果。

所以,在認識到this is sick and should never be seen in production code

Number.prototype.f = function() { 
    this.toString = function() { 
     return "2"; 
    }; 
} 
var x = new Number(0); 
x.f(); 
alert(x); 

我只在Chrome中進行了測試。

+0

非常好!以及如何將它寫入生產代碼? – user1342369 2012-04-19 13:35:37

+2

你不知道。整個概念很瘋狂。你可能有一個[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem),但你需要提出一個解釋你的用例的問題。 – Quentin 2012-04-19 13:38:30

+0

如果例如我想要做一個像這樣的函數:x.pow(y)並且結果進入x – user1342369 2012-04-19 13:47:31

1

這是不可能的。
(Pun打算)

數字是不可變的。

+0

你確定嗎?當我們做array.push(2);功能推動改變陣列! – user1342369 2012-04-19 13:24:46

+0

@ user1342369:是的,因爲數組是打算改變的數據結構。一個數字總是相同的數字,其身份不會改變或取決於任何事物。 – maerics 2012-04-19 13:31:00

+0

@ user1342369:這是因爲_arrays_不是不可變的。 – SLaks 2012-04-19 13:32:49

3

某種程度上可以做到。數字通過值傳遞,而不是參考。因此,在最好的,你可以調用y = x.f();使用此項功能:

Number.prototype.f = function() { return 2; }; 

至於您的評論:

當我們這樣做的Array.push(2);功能推動改變陣列!

當然是的。數組是對象並通過引用傳遞。該功能可能看起來是這樣的:

Array.prototype.push = function(val) { 
    var t = this; 
    t[t.length] = val; 
}; 
+0

好的...謝謝你,但是我不能通過參考傳遞x? – user1342369 2012-04-19 13:29:31

+0

如果'x'是一個原始類型(數字和字符串是主要類型),則不會發生這種情況 – 2012-04-19 13:40:18

+0

如果有人發現這個有用,複製一個數組而不通過引用傳遞 - >'newarr = arr.slice(0)' – ajax333221 2012-04-19 15:22:35