2014-10-15 2 views
1

Я немного новичок в JS, поэтому, пожалуйста, опишите.
У меня есть два экземпляра объекта, и мне нужно получить значение свойства одного экземпляра в другом. Поскольку я знаю, что JS не хватает поддержки идентификаторов объектов in-memory (а не идентификаторов DOM), поэтому мне нужно создать такое свойство. В настоящее время я использую рекурсию для создания нескольких объектов, но это просто для теста.Получение свойства объекта через объект id

function MyObject(parentID, parentProperty) { 
    this.id = parentID + 1 
    this.myProperty = parentProperty + 1 

    switch(this.id){ 
     case 5: 
     break; 

     default: 
     new MyObject(this.id, this.myProperty) 
    } 
} 
var myObject = new MyObject(1, 1); 

Итак, теперь у меня есть 4 объекта. Как получить значение myProperty объекта с, например, id = 3?

+0

Объекты, которые вы создаете внутри конструктора, не хранятся нигде. –

ответ

1

Если вам нужно вернуть объект, скажем, значение свойства, вам необходимо сохранить его в массиве или хеше объекта. Я рекомендую использовать фабричный метод для создания ваших объектов. Когда вы строите объекты в фабричном методе, также сохраняйте эти ссылки на объекты в массиве Hash/Array с помощью значений их свойств, которые вы хотите найти в более поздний момент времени.

Например,

(function(globalScope) { 
    var objectCache = [], 
     ObjectFactory; 

    globalScope.ObjectFactory = ObjectFactory = { 
     create : function(parentID, parentProperty) { 
      var newObj = new function() { 
       this.id = parentID + 1 
       this.myProperty = parentProperty + 1     
      }; 
      objectCache.push(newObj); 
      return newObj; 
     }, 
     findObjectById : function(parentId) { 
      //iterate through objectCache and find your object and returna 
     } 
    }; 
})(this); 

Для хранения объектов в хэш-объектов (вместо массива)

var objHashCache = {}; 
var obj = new Object(); 
objHashCache[obj.id] = obj; 

когда вы хотите retrive объект по его ID, вы можете использовать

return objHashCache[idToLookFor] 
+0

Таким образом, я не могу сохранить прямую ссылку на объект, и используя эту ссылку для получения необходимых значений свойств? Итерация не очень хороша для производительности, не так ли? –

+0

Вы можете сохранить прямую ссылку (сама ссылка объекта) на объект в массиве и выполнить итерацию по ней. Если вы собираетесь делать больше запросов, чем вставлять/удалять, вы можете использовать хэш объекта ({}) и хранить ссылки в хеше объекта. См. Мое редактирование ответа для псевдокода. –

+0

Я проверю это решение сегодня вечером, thnx. Правильно ли я понимаю, что мне нужно будет использовать что-то вроде | return objHashCache [3] .myProperty() |? –

0

Я бы сохранил статическую карту объектов на самой функции MyObject с ключом id. Заполните эту карту в конструкторе, а затем у вас есть карта всех экземпляров созданного объекта.

В вашем примере:

function MyObject(parentID, parentProperty) { 
    this.id = parentID + 1; 
    this.myProperty = parentProperty + 1; 
    MyObject.instances = MyObject.instances || {}; 
    MyObject.instances[this.id] = this; 
} 

for (var i = 0; i < 5; i++) { 
    var myObject = new MyObject(i, i); 
} 
var thirdObject = MyObject.instances[3]; 
0

В основном вы должны перебрать все ваш объект и найти объект с условием.

Если вы знаете, и что LINQ лучше подходит для ваших потребностей, вы можете использовать LINQ (http://linqjs.codeplex.com)

(я из мобильных и я починю форматирование моего ответа, когда я перед компьютером)

Смежные вопросы