Может ли объект javascript иметь свойство, являющееся коллекцией объектов другого типа? - PullRequest
3 голосов
/ 29 ноября 2011

Я решил (смело или глупо это еще предстоит выяснить) решил повысить свои навыки работы с JavaScript за счет использования предупреждений, и я рассматривал возможность использования бизнес-объектов javascript в надежде создать полезную библиотеку объектов, которыми я смогу управлять с помощью JSON или XML дальше вниз по линии.

Основные понятия достаточно просты, но я нигде не могу найти пример того, как открыть свойство объекта, представляющего собой коллекцию другой тип объекта.

Например, если у меня есть объект "Отдел", я хотел бы иметь свойство "Сотрудники", которое является коллекцией объектов "Сотрудник".

Я из .Net фона, поэтому я мог бы прийти к этому с совершенно неправильным мышлением, но если бы я был, я хотел бы узнать правильный способ подойти к этому.

Является ли концепция все еще применимой в javascript, может ли свойство объекта javascript быть коллекцией объектов другого типа? Существует ли вообще понятие коллекции (я хотел бы иметь возможность перечислять также всю коллекцию) или я должен думать в терминах массивов или чего-то еще?

Вот некоторый псевдокод, который должен иллюстрировать то, к чему я стремлюсь:

function Department (Name) 
{
    this.DepartmentName=Name;
    this.Employees = null; // How do I initialise a property to be a collection of Employee objects?
    }

function Employee(FirstName, Surname)
{
    this.EmployeeName = Firstname + ' ' + Surname;
}

Department.prototype.addEmployee = function (Firstname, Surname) 
{
    //In here I want to create an Employee object and add it to an
    //'Employees' property of the department object
}

1 Ответ

5 голосов
/ 29 ноября 2011

В JavaScript нет реального "списка объектов определенного типа". Вы, похоже, просто хотите массив , который представляет собой «коллекцию» (в основном объект) с числовыми ключами и значениями, которые могут быть любыми (JavaScript динамический, поэтому нет простого способа заставить коллекцию содержать только предметы одного типа, но вам все равно это не нужно):

function Department (Name) 
{
    this.DepartmentName = Name;
    this.Employees = []; // empty array
}

Затем в функции-прототипе вы можете:

  1. создать новый экземпляр (объект) типа Employee
  2. добавить к this.Employees

Как:

Department.prototype.addEmployee = function (Firstname, Surname) 
{
    // adds to the end of the array
    this.Employees.push(new Employee(Firstname, Surname));
};

Вы можете получить доступ к Employee объектам, таким как this.Employees[0] и т. Д.

Не забывайте точку с запятой в конце функции-прототипа. Это выражение функции , и хорошей практикой является завершение выражений функции точкой с запятой. Объявления функций (как для Department и Employee), с другой стороны, не нуждаются в них. Разница в том, что функция-прототип используется в качестве выражения в операторе присваивания.

Более того, CapitalCase обычно используется для конструкторов (Employee); обычные имена переменных обычно являются именами в camelCase.

...