Мы знаем, что JS ориентирован на объект. Когда дело доходит до объектной ориентации, неизбежно привлекать концепцию классов. Как правило, сильно напечатанные языки, такие как C# и Java, имеют фиксированный синтаксис для определения классов. Разница между JS заключается в том, что он может использовать различные методы для реализации собственных классов и объектов. Есть несколько общих методов реализации:
1. Заводской метод
Метод завода относится к созданию заводской функции, которая возвращает конкретный тип объекта.
Кода -копия выглядит следующим образом:
Функция CreateCar (Scolor, Idoors, IMPG)
{
var otempcar = новый объект;
otempcar.color = scolor;
otempcar.doors = idoors;
otempcar.mpg = IMPG;
otempcar.showcolor = function ()
{
предупреждение (this.color);
}
вернуть otempcar;
}
var ocar1 = createcar ("red", 4,23);
var ocar2 = createcar ("синий", 3,25);
ocar1.showcolor ();
ocar2.showcolor ();
Таким образом, каждый раз, когда он называет свою заводскую функцию, будет создан новый объект. Но проблема заключается в том, что каждый раз, когда генерируется новый объект, необходимо создавать новую функцию, которая заставляет каждого объекта есть своя версия ShowColor, и на самом деле все объекты имеют одну и ту же функцию. Является ли метод объекта, определяется вне заводской функции, а затем объекту дается указатель на функцию, следующим образом
Кода -копия выглядит следующим образом:
функция showcolor ()
{
предупреждение (this.color);
}
Функция CreateCar (Scolor, Idoors, IMPG)
{
var otempcar = новый объект;
otempcar.color = scolor;
otempcar.doors = idoors;
otempcar.mpg = IMPG;
otempcar.showcolor = showcolor;
вернуть otempcar;
}
var ocar1 = createcar ("red", 4,23);
var ocar2 = createcar ("синий", 3,25);
ocar1.showcolor ();
ocar2.showcolor ();
Таким образом, нет необходимости создавать свою собственную функцию Showcolor для каждого объекта, но просто создайте указатель на эту функцию. Следовательно, метод конструктора введен.
2. Метод конструктора
Конструктор очень похож на заводскую функцию, пример кода заключается в следующем:
Кода -копия выглядит следующим образом:
Функциональный автомобиль (Scolor, Idoors, IMPG)
{
this.color = scolor;
this.doors = idoors;
this.mpg = IMPG;
this.showcolor = function ()
{
предупреждение (this.color);
}
}
var ocar1 = новый автомобиль ("красный", 4,23);
var ocar2 = новый автомобиль ("синий", 3,25);
В конструкторе нет объекта, созданного внутри, но ключевое слово, которое используется. При вызове конструктора с помощью нового оператора создается объект перед выполнением первой строки кода. Но какие проблемы произойдут с этим? Чтобы решить эту проблему, был введен следующий метод прототипа.
3. Прототип метод
Этот метод использует преимущества свойства прототипа объекта, которое можно рассматривать как прототип, от которого зависит новый объект. Здесь используйте пустой конструктор, чтобы установить имя класса. Затем все методы и атрибуты напрямую назначаются атрибуту прототипа. следующее:
Кода -копия выглядит следующим образом:
Функциональный автомобиль ()
{}
Car.prototype.color = "red";
Car.prototype.doors = 4;
Car.prototype.mpg = 23;
Car.prototype.drivers = new Array ("Mike", "Sue");
Car.prototype.showcolor = function ()
{
предупреждение (this.color);
}
Метод прототипа может присваивать значения только напрямую и не может передавать параметры для конструктора значения инициализации атрибута. При использовании этого метода вы столкнетесь с двумя проблемами. Первая проблема заключается в том, что каждый объект должен быть создан до того, как значение атрибута по умолчанию будет изменено таким образом. Невозможно напрямую иметь значения свойства, которые вам нужны при создании каждого объекта. Это раздражает. Вторая проблема - когда атрибут относится к объекту. Там не будет проблем с совместным использованием функций, но будут проблемы с обменом объектами. Потому что каждый экземпляр обычно должен реализовать свой собственный объект.
Следующее:
Кода -копия выглядит следующим образом:
var ocar1 = new Car ();
var ocar2 = new Car ();
ocar1.divers.push ("matt");
Alert (ocar1.divers); // вывод "Майк, Сью, Мэтт"
Alert (ocar2.drivers); // вывод "Майк, Сью, Мэтт"
Поэтому атрибут драйверов - это просто указатель на объект, поэтому все экземпляры действительно имеют один и тот же объект. Из -за этих проблем мы вводим следующий метод использования совместного использования и метод прототипа.
4. Метод смешанного конструктора/прототипа
Идея этого метода состоит в том, чтобы использовать конструктор для определения всех нефункциональных свойств объекта (включая обычные свойства и атрибуты, указывающие на объект), и использовать прототип для определения свойств функции (методов) объекта. Результатом является то, что все функции создаются только один раз, и каждый объект имеет свой собственный экземпляр атрибута объекта. Пример кода заключается в следующем:
Кода -копия выглядит следующим образом:
Функциональный автомобиль (Scolor, Idoors, IMPG)
{
this.color = scolor;
this.doors = idoors;
this.mpg = IMPG;
this.divers = new Array ("Mike", "Sue");
}
Car.prototype.showcolor = function ()
{
предупреждение (this.color);
}
var ocar1 = новый автомобиль ("красный", 4,23);
var ocar2 = новый автомобиль ("синий", 3,25);
ocar1.divers.push ("matt");
Alert (ocar1.divers); // вывод "Майк, Сью, Мэтт"
Alert (ocar2.drivers); // вывод "Майк, Сью"
Как видно из примера кода, этот метод решает две проблемы в предыдущем методе одновременно. Однако, таким образом, некоторые разработчики по -прежнему чувствуют, что это не идеально.
5. Динамический метод прототипа
Мы можем видеть, что большинство объектно-ориентированных языков визуально инкапсулируют свойства и методы. Однако метод ShowColor в приведенном выше методе определяется вне класса. Поэтому они разработали динамический подход прототипа. Основная идея этого подхода такая же, как и подход смешанного конструктора/прототипа, единственное отличие - это местоположение метода объекта. Как показано ниже:
Кода -копия выглядит следующим образом:
Функциональный автомобиль (Scolor, Idoors, IMPG)
{
this.color = scolor;
this.doors = idoors;
this.mpg = IMPG;
this.divers = new Array ("Mike", "Sue");
if (typeof car._initialized == "не определен")
{
Car.prototype.showcolor = function ()
{
предупреждение (this.color);
}
}
Car._initialize = true;
}
Таким образом Car.prototype.showcolor создается только один раз. Эта зависимость делает этот код более похожим на определение класса на других языках.
6. Смешанный фабричный метод
Этот подход обычно является обходным путем, который не может быть использован в качестве первого подхода. Его цель - создать поддельный конструктор, который возвращает только новые экземпляры другого объекта.
Кода -копия выглядит следующим образом:
функция createCar ()
{
var otempcar = новый объект;
otempcar.color = "red";
otempcar.doors = 4;
otempcar.mpg = 23;
otempcar.showcolor = function ()
{
предупреждение (this.color);
};
вернуть otempcar;
}
var car = new Car ();
Поскольку новый оператор называется внутри конструктора CAR (), второй новый оператор автоматически игнорируется. Объекты, созданные внутри конструктора, передаются обратно в переменную Var. Этот подход имеет те же проблемы, что и классический подход с точки зрения внутреннего управления объектными методами. Поэтому настоятельно рекомендуется: избегайте использования этого метода, если это не абсолютно необходимо.