最近我开始学习 JavaScript 中的面向对象编程。我的理解是,当引用变量时,我们实际上引用的不是它们的实际值,而是内存中的位置。这就是为什么所有那些应该复制实例的“返回这个”方法都不起作用的原因。
所以,示例代码:
//An example object with a simple property and
//failing "copy" function.
function MyObject()
{
this.myProperty = 123;
this.copy = function() { return this; };
}
var iOne = new MyObject();
var iTwo = iOne.copy();
iTwo.myProperty = 321;
现在 iOne 和 iTwo 的“myProperty”属性都等于 321,因为“copy”方法返回了一个引用,而不是一个值。这种行为是意料之中的,一切正常。
现在,我尝试对原生对象类型 Number 执行相同的操作。让我们以更面向对象的程序员友好的方式创建它的一个实例:
var iOne = new Number(123);
var iTwo = iOne; //Equals "iTwo = iOne.copy()", except there isn't a copy method
iOne = 321;
而现在,可怕的事情发生了。iOne 等于 321,但 iTwo 保持其值,仍然等于 123。
我不知道这种行为是由什么引起的。也许 Number 是某种“特殊”?也许与它相关的十进制数不仅仅是一个属性?或者也许它只是为了让没有经验的程序员的生活更轻松?最后一个选项与运算符有关。如果有人对此有所了解,请不要让我理解 JavaScript 的方式崩溃。