Фабричный способ javaScript, примитивный способ
Поскольку свойства объекта могут быть определены динамически после его создания, код, подобный следующему, был написан при первом появлении JavaScript.
Скопируйте код кода следующим образом:
вар oCar = новый объект;
oCar.color = "синий";
оCar.двери = 4;
oCar.mpg = 25;
oCar.showColor = функция() {
оповещение(this.color);
};
В приведенном выше коде создается объектный автомобиль. Затем придайте ему несколько атрибутов: он синий, у него четыре двери, расход топлива составляет 25 миль на галлон. Последний атрибут на самом деле является указателем на функцию, то есть атрибут является методом. После выполнения этого кода объектную машину можно использовать. Но здесь есть проблема: вам может потребоваться создать несколько экземпляров автомобиля, что, очевидно, не является хорошим способом.
Решение: фабричные методы
Чтобы решить эту проблему, разработчики создали фабричные функции, создающие и возвращающие объекты определенного типа. Например, функцию createCar() можно использовать для инкапсуляции ранее перечисленных операций создания объекта автомобиля:
Скопируйте код кода следующим образом:
функция createCar(sColor,iDoors,iMpg) {
вар oTempCar = новый объект;
oTempCar.color = sColor;
oTempCar.doors = iDoors;
oTempCar.mpg = iMpg;
oTempCar.showColor = функция() {
оповещение(this.color);
};
вернуть oTempCar;
}
var oCar1 = createCar("красный",4,23);
var oCar2 = createCar("синий",3,25);
oCar1.showColor(); //Вывод «красный»
oCar2.showColor(); //Вывод «синий»
Вызов этой фабричной функции создаст новый объект и присвоит ему все необходимые атрибуты. Добавьте параметры в функцию createCar(), чтобы присвоить значения атрибутам цвета, дверей и миль на галлон создаваемого объекта автомобиля. Это приводит к тому, что два объекта имеют одинаковые свойства, но разные значения свойств. Плохо в этом методе то, что каждый раз, когда создается объект автомобиля (то есть функция createCar вызывается один раз), метод showColor создается повторно для каждого объекта. На самом деле это не обязательно, чтобы каждый объект был одинаковым. функция. Поэтому мы пытаемся объявить атрибуты метода вне функции.
Определите методы объекта вне фабричных функций
Некоторые разработчики избегают этой проблемы, определяя метод объекта вне фабричной функции, а затем указывая на этот метод через свойство:
Скопируйте код кода следующим образом:
функция showColor() {
оповещение(this.color);
}
функция createCar(sColor,iDoors,iMpg) {
вар oTempCar = новый объект;
oTempCar.color = sColor;
oTempCar.doors = iDoors;
oTempCar.mpg = iMpg;
oTempCar.showColor = showColor;
вернуть oTempCar;
}
var oCar1 = createCar("красный",4,23);
var oCar2 = createCar("синий",3,25);
oCar1.showColor(); //Вывод «красный»
oCar2.showColor(); //Вывод «синий»
В приведенном выше переписанном коде функция showColor() определена перед функцией createCar(). Внутри createCar() объекту передается указатель на существующую функцию showColor(). Функционально это решает проблему многократного создания объектов-функций, но семантически функция не похожа на метод объекта;