2012-04-19 86 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