Javascript ExtJs继承行为
有人能给我解释一下这种行为吗。 让我们声明一个类:Javascript ExtJs继承行为,javascript,inheritance,extjs,Javascript,Inheritance,Extjs,有人能给我解释一下这种行为吗。 让我们声明一个类: 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:fu
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”未声明为静态!
我一点也不明白。当您在类声明中放入某些内容时,这意味着它被推送到对象原型上(阅读:它在所有实例中共享)。对于字符串/数字/布尔来说,这并不是一个真正的问题,但是对于对象和数组,您将看到这种行为开始生效 如果希望每个实例都有一个数组/对象,则需要将其显式添加到实例中:
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);
}
});
这是因为这里有一点:
Ext.define('baseClass',{
a:null,
ar:[], <--------------------------- you're instantiating an array object!
因此,两个对象共享同一个数组,因为对象构造函数只复制对数组的引用,而不是完整的数组对象
不确定Ext.js如何处理构造函数/初始值设定项,但您需要在对象构造期间创建数组,而不是在声明数组时
好吧,谷歌给了我这个:
Ext.define('baseClass',{
constructor: function () {
this.ar = [];
},
这应该可以解决您的问题。谢谢,您能澄清为什么它与字符串/数字/bool不同吗?它没有任何区别,只是数组/对象是“引用”类型。字符串/数字/bool是不可变的数据类型。操作该值的唯一方法是将新值重新分配给相关属性,在大多数情况下,该属性会将新值作为特定实例的成员应用(
this.a=“mystring”
)。原型(共享)将保持不变。
Ext.define('baseClass',{
constructor: function () {
this.ar = [];
},