gpt4 book ai didi

javascript - 为什么javascript在实例之间共享属性

转载 作者:行者123 更新时间:2023-11-30 11:56:34 25 4
gpt4 key购买 nike

如果这个问题看起来很愚蠢,我深表歉意,但我对 JS 还比较陌生。

我有一个继承 Animal 的 Dog 类。 Animal 有一个数组属性。在代码中,我创建了一个新的 Dog 并将内容添加到数组中。问题是 Dog 的每个新实例似乎都共享该数组。

动物.js:

define([
"dojo/_base/declare",
"evo/common/model/_Model"
], function(declare, _Model ) {
return declare([_Model], {
_id: 0,
_items: [],
_filter: null,

...

});
});

狗.js:

define([
"dojo/_base/declare",
"evo/common/model/_ModelList"
], function (declare, _ModelList) {
return declare([_ModelList], {

...

});
});

我修复了创建新 Dog 时重置 _items 的问题,但我怀疑如果我有多个 Dog 实例,这会影响所有实例。如何使属性非静态?

最佳答案

当创建一个 dojo 类时,如果它包含数组或其他对象,它们应该在 constructor() 中声明,这样每个实例都会按照您的预期获得自己的副本。

请注意,在 JS 中,字符串、数字、 bool 值、null 等简单类型是按值分配的,可以在 dojo 类中声明。

相反,对象通过引用分配,包括数组(在 JS 中被视为“特殊”对象)。

例子:

https://jsfiddle.net/ua3gytbu/

require(["dojo/_base/declare"], function(declare) {
var Animal = declare(null, {
constructor: function() {}
});
var Dog = declare(Animal, {
constructor: function() {
this.items = [];
}
});

var dog = new Dog();
dog.items.push(1);
dog.items.push(2);

var dog2 = new Dog();
dog2.items.push(3);

alert('dog has in items ' + dog.items.length);
alert('dog2 has in items ' + dog2.items.length);
});

关于javascript - 为什么javascript在实例之间共享属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37753128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com