Существует несколько распространенных способов определения классов или объектов в JavaScript: заводской подход
функция createCar(цвет, двери, мили на галлон){
вар tempCar = новый объект;
tempCar.color = цвет;
tempCar.doors = двери;
tempCar.mpg = миль на галлон;
tempCar.showColor = функция (){
предупреждение ( этот .цвет);
};
вернуть tempCar;
}
var car1 = createCar("красный", 4, 23);
var car2 = createCar("синий", 3, 25);
автомобиль1.showColor();
car2.showColor();
Определена фабричная функция, которая может создавать и возвращать объекты определенного типа. Выглядит хорошо, но есть небольшая проблема. При каждом вызове необходимо создавать новую функцию showColor. Мы можем переместить ее за пределы функции. функция showColor(){ оповещение(this.color); } Укажите на него непосредственно в фабричной функции. tempCar.showColor = showColor; Это позволяет избежать проблемы многократного создания функций, но не похоже на метод объекта. Режим конструктора
функция Car(sColor, iDoors, iMpg){
этот .color = sColor;
это .doors = iDoors;
это .mpg = iMpg;
это .showColor = функция (){
предупреждение ( этот .цвет);
};
}
var car1 = новый автомобиль("красный", 4, 23);
var car2 = новая машина("синий", 3, 25);
автомобиль1.showColor();
car2.showColor();
Вы можете увидеть отличие от первого метода. Внутри конструктора не создается объект, но используется ключевое слово this. При вызове конструктора с использованием new сначала создается объект, а затем осуществляется доступ с помощью this. Это использование очень похоже на другие объектно-ориентированные языки, но этот метод имеет ту же проблему, что и предыдущий, а именно многократное создание функций. Гибридный подход конструктора/прототипа к конструированию.
Этот метод заключается в одновременном использовании метода конструктора и метода прототипа. Объединяя их преимущества, метод конструктора был представлен ранее. Теперь давайте посмотрим на метод прототипа. функция Автомобиль(){
}
Car.prototype.color = "красный";
Car.prototype.doors = 4;
Автомобиль.прототип.миль на галлон = 23;
Car.prototype.showColor = функция (){
предупреждение ( этот .цвет);
};
вар car1 = новый автомобиль ();
вар car2 = новый автомобиль ();
Сначала конструктор Car определяется без какого-либо кода, а затем свойства добавляются через прототип. преимущество: а. Все экземпляры хранят указатели на showColor, что решает проблему многократного создания функций. б. Вы можете использовать instanceof для проверки типа объекта. предупреждение (car1 экземпляр автомобиля); // правда Недостатки, добавьте следующий код:
Car.prototype.drivers = new Array("Майк", "Сью");
car1.drivers.push("Мэтт");
alert(car1.drivers); // выводит «Майк, Сью, Мэтт»
alert(car2.drivers); // выводит «Майк, Сью, Мэтт»
драйверы являются указателями на объекты Array, и оба экземпляра Car указывают на один и тот же массив.
Давайте воспользуемся следующим методом смешивания: функция Car(sColor, iDoors, iMpg){
этот .color = sColor;
это .doors = iDoors;
это .mpg = iMpg;
this .drivers = new Array("Майк", "Сью");
}
Car.prototype.showColor = функция (){
предупреждение ( этот .цвет);
};
var car1 = новый автомобиль("красный", 4, 23);
var car2 = новая машина("синий", 3, 25);
car1.drivers.push("Мэтт");
оповещение(car1.drivers);
оповещение(car2.drivers);
Таким образом, проблем нет, и вы также можете использовать экземпляр динамическое прототипирование
функция Car(sColor, iDoors, iMpg){
этот .color = sColor;
это .doors = iDoors;
это .mpg = iMpg;
this .drivers = new Array("Майк", "Сью");
if ( typeof Car.initialized == "не определено"){
Car.prototype.showColor = функция (){
предупреждение ( этот .цвет);
};
Car.initialized = правда ;
}
}
var car1 = новый автомобиль("красный", 4, 23);
var car2 = новая машина("синий", 3, 25);
car1.drivers.push("Мэтт");
оповещение(car1.drivers);
оповещение(car2.drivers);
Этот метод мой любимый. Все определения классов завершаются в функции. Он очень похож на определения классов в других языках. Вы также можете использовать экземпляр.