2012-06-14 2 views
3

Я пытаюсь установить базовый класс и производный класс с помощью ExtJS с помощью Ext.extend.Inheritance And ExtJs using extend

: Базовый класс:

var Base = Ext.extend(Object, { 
    settings: {}, 
    constructor: function(args) { 
     var baseArgs = { 'user': '', 'password': '' }; 
     Ext.apply(this.settings, args, baseArgs); 
    } 
}); 

: производный класс:

var Derived = Ext.extend(Base, { 
    constructor: function(args) { 
     Derived.superclass.constructor.call(this, args); 
    } 
}); 

: Проблема:

var test1 = new Derived({ 'user': 'blackey1', 'password': 'blackeypw1' }); 
var test2 = new Derived({ 'user': 'blackey2', 'password': 'blackeypw2' }); 

В этом точка test1.settings эквивалентна test2.settings (с использованием blackey2 и blackeypw2), как если бы они указывали на один и тот же объект, я ищу, как создать независимые объекты.

Спасибо за помощь!

ответ

5

С текущего кода, пустой settings объект добавляется к прототипу Base, так что один settings объект разделяется всеми экземплярами Base и любых экземпляров классов, производных от Base (как Derived). То, что вы должны сделать вместо этого создать пустой settings объект в constructor функции Base «s так, что каждый экземпляр получает свой собственный settings объект:

var Base = Ext.extend(Object, { 
    constructor: function(args) { 
     var baseArgs = { 'user': '', 'password': '' }; 
     this.settings = {}; 
     Ext.apply(this.settings, args, baseArgs); 
    } 
}); 
+0

Спасибо за разъяснение! – Blackey

+0

Спасибо за ответ. Можете ли вы прояснить логику того, почему один и тот же экземпляр объекта настроек используется всеми экземплярами классов Base и Derived? Это полностью меня застало врасплох. Обычно можно ожидать, что каждый объект Derived получит собственный экземпляр настроек. –

+0

@PraveenKumar Это из-за прототипного наследования JavaScript. См. [Этот связанный вопрос] (http://stackoverflow.com/questions/4425318/javascript-object-members-that-are-prototyped-as-arrays-become-shared-by-all-cla). – JohnnyHK