2
function Class () {

var self = this;
this.hi = true; // this { hi: true }, self { hi: true }
self.hi = false; // this { hi: false }, self { hi: false }

}

为什么 self 的行为不像正常的 var?

4

2 回答 2

5

这是因为this它(总是)一个对象,而不是一个原始的。

当您将包含(或更准确地说“指向”)对象的变量分配给新变量时,两个变量都指向同一个对象 - 它是“通过引用复制”。通过这两个变量可以看到对该对象内容的更改。

当您将包含原语的变量分配给新变量时,您将该值的副本分配给新变量。对原始变量的更改不会影响新变量。

于 2013-05-22T13:18:28.250 回答
1

这里没有什么特别之处self。尝试使用任何两个变量名称。这就是大多数现代语言的工作方式。

var x = {};
var y = x;

x.hi = true; // x { hi: true }, y { hi: true }
y.hi = false; // x { hi: false }, y { hi: false 

正如杰克指出的那样,这里要实现的关键是两个变量都引用同一个对象。

请注意,如果您想在这种情况下“按值复制”(复制对象),您可以选择。一些库,例如UnderscoreLo-Dash,有一个clone方法可以用来创建一个新对象并使用与另一个相同的属性填充它:

var y = _.clone(x);
于 2013-05-22T13:18:44.793 回答