我有这样的功能:改变的价值“这一”
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底!
我有这样的功能:改变的价值“这一”
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底!
你不能这样做,确切的说,但你可以通过显式使用数构造函数和重写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中进行了测试。
非常好!以及如何将它写入生产代码? – user1342369 2012-04-19 13:35:37
你不知道。整个概念很疯狂。你可能有一个[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem),但你需要提出一个解释你的用例的问题。 – Quentin 2012-04-19 13:38:30
如果例如我想要做一个像这样的函数:x.pow(y)并且结果进入x – user1342369 2012-04-19 13:47:31
这是不可能的。
(Pun打算)
数字是不可变的。
你确定吗?当我们做array.push(2);功能推动改变阵列! – user1342369 2012-04-19 13:24:46
@ user1342369:是的,因为数组是打算改变的数据结构。一个数字总是相同的数字,其身份不会改变或取决于任何事物。 – maerics 2012-04-19 13:31:00
@ user1342369:这是因为_arrays_不是不可变的。 – SLaks 2012-04-19 13:32:49
某种程度上可以做到。数字通过值传递,而不是参考。因此,在最好的,你可以调用y = x.f();
使用此项功能:
Number.prototype.f = function() { return 2; };
至于您的评论:
当我们这样做的Array.push(2);功能推动改变阵列!
当然是的。数组是对象并通过引用传递。该功能可能看起来是这样的:
Array.prototype.push = function(val) {
var t = this;
t[t.length] = val;
};
好的...谢谢你,但是我不能通过参考传递x? – user1342369 2012-04-19 13:29:31
如果'x'是一个原始类型(数字和字符串是主要类型),则不会发生这种情况 – 2012-04-19 13:40:18
如果有人发现这个有用,复制一个数组而不通过引用传递 - >'newarr = arr.slice(0)' – ajax333221 2012-04-19 15:22:35
这将是很好的解释_为什么你需要这样做。可能有更好的方法。 – drnewman 2012-04-19 13:39:32