有人可以向我解释这个行为。 让我们宣布一个类:
Ext.define('baseClass',{
a:null,
ar:[],
add:function(v) {
this.ar.push(v);
},
sayAr:function() {
console.log(this.ar);
},
setA:function(v) {
this.a= v;
},
sayA:function() {
console.log(this.a);
}
});
现在我创建了两个对象
var a = Ext.create('baseClass');
var b = Ext.create('baseClass');
测试属性
a.setA(1);
b.setA(2);
a.sayA();
b.sayA();
此输出
1
2
一切都很好,但是
a.add(1);
b.add(2);
a.sayAr();
b.sayAr();
我们得到了
[1,2]
[1,2]
这个我不明白。为什么它为两个对象使用单独的“a”属性,但使用一个“ar”数组。 “ar”未声明为静态! 我根本没有得到它。
答案 0 :(得分:8)
当你在类声明中放入一些内容时,它意味着它被推送到对象原型上(读取:它在所有实例中共享)。对于字符串/数字/布尔值来说,这不是一个真正的问题,但对于对象和数组,你会看到这种行为的实现。
如果您希望每个实例都有一个数组/对象,那么您需要在实例中明确添加它:
Ext.define('baseClass',{
a:null,
constructor: function(){
this.ar = [];
}
add:function(v) {
this.ar.push(v);
},
sayAr:function() {
console.log(this.ar);
},
setA:function(v) {
this.a= v;
},
sayA:function() {
console.log(this.a);
}
});
答案 1 :(得分:3)
这是因为这一点:
Ext.define('baseClass',{
a:null,
ar:[], <--------------------------- you're instantiating an array object!
为了更清楚,上面的代码相当于:
Ext.define('baseClass',{
a:null,
ar:new Array(),
因此,两个对象共享同一个数组,因为对象构造函数只复制对数组的引用而不是完整的数组对象。
不确定Ext.js如何处理构造函数/初始值设定项,但是你需要在对象构造期间创建数组而不是在声明它时....
好的,谷歌搜索给了我这个:Ext.define('baseClass',{
constructor: function () {
this.ar = [];
},
这应该可以解决你的问题。