Поведение наследования 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:function() {
console.log(this.a);
}
});
теперь я создаю два объекта
var a = Ext.create('baseClass');
var b = Ext.create('baseClass');
2 ответов
когда вы помещаете что-то в объявление класса, это означает, что оно выталкивается на прототип объекта (читай: он получает общий доступ ко всем экземплярам). Это не проблема для строк/чисел / булов, но для объектов и массивов вы увидите, что это поведение вступает в силу.
Если вы хотите иметь массив / объект на экземпляр, то вам нужно явно добавить его в экземпляр:
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.define('baseClass',{
a:null,
ar:new Array(),
таким образом, оба объекта имеют один и тот же массив, потому что конструктор объекта копирует только ссылку на массив, а не полный объект массива.
не уверен, как Ext.js обрабатывает конструкторы / инициализаторы, но вам нужно создать массив во время построения объекта, а не при его объявлении....
хорошо, гуглить дал мне это:
Ext.define('baseClass',{
constructor: function () {
this.ar = [];
},
Это должно решить вашу проблему.