2010-07-28 3 views
0

Я новичок в объектной модели JavaScript (прототип на основе), и я пытаюсь сделать следующее:Вопрос о объекте/массиве Javascript?

У меня есть конструктор, который просто инициализирует массив: this.myArray = []. У меня есть метод:

MyConstructor.prototype.addToArray = function(myObject, type) { 
    // 
}; 

В принципе мне нужно myArray быть прикрепленным к конкретному type. То есть когда вызывается addToArray(), объект будет добавлен в массив, связанный с type. Я не хочу заранее знать все возможные типы. Мне также нужно будет добавить методы, которые очищают массив, содержащий объекты определенного типа. Поэтому в принципе, мне кажется, мне нужно каким-то образом создать массивы динамически, связанные с типом.

Любая помощь будет оценена по достоинству.

Я думаю, что мой вопрос запутан, поэтому я попытаюсь уточнить: мой «бизнес-код» создает объекты, которые мне нужно отслеживать. Каждый объект связан с определенным «типом» или «ароматом». Я пытаюсь создать общий объект, который обрабатывает эти ссылки на объекты в массивах (массив для каждого типа) и обрабатывает операции над этими объектами. Затем операции могут выполняться на всех объектах данного типа. Я хочу иметь возможность сделать это, не зная типов раньше времени (т. Е. Не создавать 1 массив для каждого типа в конструкторе).

"Тип" может быть любым. то есть строку «typeA» или «typeB» и т. д., просто способ разграничения между различными классами объектов.

+0

Ваш вопрос сбивает с толку. JavaScript динамически набирается, поэтому на самом деле не так много разных вещей, которые вы вернетесь из ['typeof'] (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/typeof_Operator). Вы в основном говорите о создании однородных массивов, например. один массив для хранения строк, другой - для хранения чисел и т. д.? –

+0

Имеются ли в ваших бизнес-объектах свойство, идентифицирующее их «тип»? – Ronald

ответ

1

Вы могли бы сделать что-то вроде этого:

var objects = {}; 
... 
if (objects[type]) { 
    objects[type].push(myObject); 
} else { 
    objects[type] = [myObject]; 
} 
//...similar methods to delete objects, etc. 
+0

Что делает установка переменной равной {} do? Как это отличается от установки равным []? thanks – ewa

+0

{} - пустой объект. Я использую его как ассоциативный массив: он имеет массив [] объектов для каждого типа, как object [type] = [obj1, obj2, ...]. Это также похоже: object = {type1: [obj1, ...], type2: [foo, bar, ...]}. – jtbandes

+0

Часть {}, которую вы хотите оставить вне своей функции; остальные входят внутрь, чтобы добавить объект в соответствующий массив. Извините, я не могу быть более полезным, я набираю это на своем телефоне ... :) – jtbandes

1

Если я правильно истолковал ваш вопрос, невозможно сделать то, что вы хотите, поскольку массивы JavaScript не набраны - вы можете поместить любой тип объекта в любой массив.

EDIT:

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

Например,

function Cache() {} 

Cache.prototype.add = function (obj) { 
this[obj.constructor.name] === undefined? this[obj.constructor.name] = [obj] : 
this[obj.constructor.name].push(obj); 
} 

function Constructor1(name, age) { 
    this.name = name; 
    this.age = age; 
} 

var cache = new Cache; 
var con1 = new Constructor1('me', 10); 
cache.add(con1); 

console.log(cache) // has property 'Constructor1' containing an array with reference 
        // to object con1 in. 

При таком подходе вы должны быть осторожными и приумножить имя конструктора при наследовании от объектов.

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