function Class () {
var self = this;
this.hi = true; // this { hi: true }, self { hi: true }
self.hi = false; // this { hi: false }, self { hi: false }
}
为什么自我行为不像普通变种?
答案 0 :(得分:5)
这是因为this
(总是)是一个对象,而不是一个原语。
当您将包含(或更准确地“指向”)对象的变量分配给新变量时,两个变量都指向同一个对象 - 它是“按引用复制”。通过两个变量都可以看到对该对象的内容的更改。
将包含原语的变量分配给新变量时,将该值的副本分配给新变量。对原始变量的更改不会影响新变量。
答案 1 :(得分: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
作为Jack pointed out,这里要实现的关键是两个变量都引用同一个对象。
请注意,如果您希望在此类情况下“按值复制”(复制对象),则可以选择。某些库(例如Underscore和Lo-Dash)具有clone
方法,您可以使用该方法创建新对象并使用与另一个相同的属性填充它:
var y = _.clone(x);