2011-01-20 3 views
0

Я пытаюсь создать несколько объектов, как это:свойство Javascript существует и область применения

Object_level_1 = Ext.extend (Ext.util.Observable, { 
    PropA: null, 
    ProbB: null, 
    initComponent: function() { 
    Object_level_1.superclass.initComponent.call(); 
    }, 
    setValue: function (name, value) { // it will come as 'PropA', 45 
    if (this.hasOwnProperty (name)) { // ' fixed base on dtan answer 
     // here is a problem 1 
     // how I can access correct property and set it up 
     // problem 2 
     // How I set up property value of right property by having variable name 
     this.fireEvent ('Update_on_level_1'); 
    }  
    } 
} 

Object_level_2 = Ext.extend (Object_level_1, { 
    PropC: null, 
    ProbD: null, 
    initComponent: function() { 
    Object_level_1.superclass.initComponent.call(); 
    }, 
    setValue: function (name, value) { // it will come as 'PropA', 45 or 'PropC', 100 
    Object_level_2.superclass.setValue (name, value); 
    if (this.hasOwnProperty (name)) { // ' fixed base on dtan answer 
     // here is a problem 1 again 
     // how I can access correct property and set it up 
     // problem 2 again 
     // How I set up property value of right property by having variable name 
     this.fireEvent ('Update_on_level_2'); 
    }  
    } 
} 

ли кто-нибудь знает решение?

ответ

1

попробуйте добавить это к вашему if заявлению:

if (name in this && this.hasOwnProperty(name) && this[name]) { 
    this.fireEvent ('Update_on_level_2'); 
} 

this[name] я считаю, больше для IE б/с Я читал, что у него есть некоторые проблемы с hasOwnProperty самих по себе (это может быть наследством хотя для IE6 и не будет большой проблемой для более новых версий). this[name], чтобы убедиться, что ваша собственность имеет значение. Если вам все равно, что значение равно false или null, тогда эту часть можно снять. Кроме того, метод hasOwnProperty исключает свойства из prototype, которые звучат так, как вы собираетесь.

Редактировать. в соответствии с комментарием @ Pointy's ниже.

+0

Проверка 'this [name]' не для слабых мест IE. Объект может иметь свойство, но значение свойства может быть нулевым. Однако проверка 'this [name]' будет 'false' также, если свойство не равно null, но равно числовому нулю, логическому значению' false' или пустой строке. Таким образом, это может быть или не быть желательным здесь. – Pointy

+0

Кажется, что-то началось: var xxx = new Object_level_2 ({}); xxx.setValue ('PropA', 345678); - fireEvent level_1 xxx.setValue ('PropD', 345678); - НЕ стрелятьEvent level_2 ??? – bensiu

+0

эти строки: 'Object_level_1.superclass.initComponent.call()' не должно иметь пробела после 'call'. не уверен, что это связано с тем, что это не работает. Кроме того, определяется ли это '' 'правильному объекту? – hellatan

2

На самом деле, я заметил ошибки в коде:

  1. Всегда объявляйте var при создании переменных
  2. При вызове метода родителя, используйте ClassName.superclass.methodName.call(this, arg1, arg2..). Важно передать this, потому что он изменит область действия метода вызываемого родителя на область текущего объекта. (Вы можете удалить this в моем следующем тестовом коде, чтобы увидеть разные выходы).
  3. Обычно я объявляю this.addEvents в initComponent перед использованием событий. Не уверен, что это необходимо.

Вот мои полные коды тестирования с выходами:

var Obj1 = Ext.extend(Ext.util.Observable, { 
    propA: null, 
    propB: null, 
    initComponent: function() { 
     Obj1.superclass.initComponent.call(this); 
    }, 
    setValue: function(name, value) { 
     if (name in this) { //Used dtan suggestion 
      this[name] = value; 
      console.log(this.propA, this.propB, this.propC, this.propD); 
     }else{ 
      console.log(name+" is not in Obj1"); 
     } 
    } 
}); 

var Obj2 = Ext.extend(Obj1, { 
    propC: null, 
    propD: null, 
    initComponent: function() { 
     Obj2.superclass.initComponent.call(this); 
    }, 
    setValue: function(name, value) { 
     Obj2.superclass.setValue.call(this, name, value); 
    } 
}); 

var obj1 = new Obj1(); 
var obj2 = new Obj2(); 
obj1.setValue('propA', '1a'); //1a null undefined undefined 
obj1.setValue('propB', '1b'); //1a 1b undefined undefined 
obj2.setValue('propC', '2c'); //null null 2c null 
obj2.setValue('propD', '2d'); //null null 2c 2d 
obj1.setValue('propA', '1a'); //1a 1b undefined undefined 
obj1.setValue('propB', '1b'); //1a 1b undefined undefined 
obj1.setValue('propC', '1c'); //propC is not in Obj1 
obj1.setValue('propD', '1d'); //propD is not in Obj1 
obj2.setValue('propA', '2a'); //2a null 2c 2d 
obj2.setValue('propB', '2b'); //2a 2b 2c 2d 
obj2.setValue('propC', '2c'); //2a 2b 2c 2d 
obj2.setValue('propD', '2d'); //2a 2b 2c 2d 

Попробуйте прочитать, как разработчики ExtJS написать свой код в src папках. Вы увидите правильное использование Ext.extend

+0

var Obj1, var Obj2 объявит переменные - причина, по которой я пропустил var, что я хочу объявить объект (var obj1 = new Obj1 (Obj1 is var) ???) - причина для разделения setValues ​​и всего вопроса заключается в том, чтобы установить значение будет происходить правильным методом ... Попробуйте прочитать вопрос. – bensiu

+0

Извините, может быть, ваш вопрос непонятен, поэтому ответ может не соответствовать вашим требованиям. –

+0

@bensiu Это может вас заинтересовать относительно 'var' http://stackoverflow.com/questions/1470488/difference-between-using-var-and-not-using-var-in-javascript –