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?
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?
这是因为this
它(总是)一个对象,而不是一个原始的。
当您将包含(或更准确地说“指向”)对象的变量分配给新变量时,两个变量都指向同一个对象 - 它是“通过引用复制”。通过这两个变量可以看到对该对象内容的更改。
当您将包含原语的变量分配给新变量时,您将该值的副本分配给新变量。对原始变量的更改不会影响新变量。
这里没有什么特别之处self
。尝试使用任何两个变量名称。这就是大多数现代语言的工作方式。
var x = {};
var y = x;
x.hi = true; // x { hi: true }, y { hi: true }
y.hi = false; // x { hi: false }, y { hi: false
正如杰克指出的那样,这里要实现的关键是两个变量都引用同一个对象。
请注意,如果您想在这种情况下“按值复制”(复制对象),您可以选择。一些库,例如Underscore和Lo-Dash,有一个clone
方法可以用来创建一个新对象并使用与另一个相同的属性填充它:
var y = _.clone(x);