我试图理解为什么以下方法有效:
鉴于我们有
var _queries = [];
function Query(queries) {
_queries = this.queries = queries;
}
Query.prototype.add = function add(query) {
_queries.push(query);
};
其中 add
操作 _queries
,而不是 this.queries
。
当我们创建一个新的查询对象时,
var query = new Query(['foo']);
query;
//=> Query { queries: ['foo'], add: function... }
query.add('bar');
query;
//=> Query { queries: ['foo', 'bar'], add: function... }
就好像 add
添加了 bar
到 this.queries
,即使 _queries
被操纵了。我不明白为什么会这样。
最佳答案
那是因为 javascript 将数组视为引用。
这行代码
_queries = this.queries = queries;
将使 _queries
和 this.queries
成为指向同一内存数组的指针。
如果你把它改成这样:
_queries = queries.slice();
this.queries = queries.slice();
然后它们将各自指向数组的不同副本。
(slice
是克隆数组的 javascript 方法)
关于javascript - 为什么可以在不引用 'this' 的情况下操作对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28184926/