представлять
Все знакомы с конструкторами, но если вы новичок, все еще необходимо понять, что такое конструкторы. Конструктор используется для создания конкретного типа объекта - не только объявляет используемый объект, но также принимает параметры для установки значения элемента объекта, когда объект создается в первый раз. Вы можете настроить свой собственный конструктор и объявить свойства или методы объекта пользовательского типа.
Основное использование
В JavaScript конструкторы обычно считаются используемыми для реализации экземпляров. JavaScript не имеет концепции классов, но имеет специальные конструкторы. Используйте новое ключевое слово, чтобы вызвать определенную раннюю функцию. Вы можете сказать JavaScript, что вы хотите создать новый объект и что объявления участника нового объекта определены в конструкторе. Внутри конструктора это ключевое слово относится к недавно созданному объекту. Основное использование заключается в следующем:
Кода -копия выглядит следующим образом:
Функциональный автомобиль (модель, год, миль) {
this.model = модель;
this.year = год;
this.miles = miles;
this.output = function () {
вернуть это.model + "Left" + this.miles + "km";
};
}
var tom = new Car («Дядя», 2009, 20000);
var dudu = new Car ("dudu", 2010, 5000);
console.log (tom.output ());
console.log (dudu.output ());
Приведенный выше пример - очень простой шаблон конструктора, но это немного проблема. Прежде всего, очень трудно использовать наследство. Во -вторых, output () переопределяется каждый раз, когда создается объект. Лучший способ - позволить всем экземплярам типа автомобиля поделиться этим методом вывода (), чтобы, если есть большие партии экземпляров, он сохранит много памяти.
Чтобы решить эту проблему, мы можем использовать следующий метод:
Кода -копия выглядит следующим образом:
Функциональный автомобиль (модель, год, миль) {
this.model = модель;
this.year = год;
this.miles = miles;
this.output = formatcar;
}
function formatcar () {
вернуть это.model + "Left" + this.miles + "km";
}
Хотя этот метод доступен, у нас есть следующий лучший метод.
Конструкторы и прототипы
В JavaScript есть свойство прототипа, называемое прототипом. Когда конструктор вызван для создания объекта, все свойства прототипа конструктора доступны на недавно созданном объекте. Таким образом, экземпляры множественных автомобильных объектов могут иметь один и тот же прототип. Давайте расширим код в приведенном выше примере:
Кода -копия выглядит следующим образом:
Функциональный автомобиль (модель, год, миль) {
this.model = модель;
this.year = год;
this.miles = miles;
}
/*
Примечание. Здесь мы использовали объект. Прототип. Имя метода, а не объект.
В основном используется, чтобы избежать переписывания объекта прототипа прототипа
*/
Car.prototype.output = function () {
вернуть это.model + "Left" + this.miles + "km";
};
var tom = new Car («Дядя», 2009, 20000);
var dudu = new Car ("dudu", 2010, 5000);
console.log (tom.output ());
console.log (dudu.output ());
Здесь один экземпляр output () может быть использован и используется во всех экземплярах объекта автомобиля.
Также: мы рекомендуем, чтобы конструкторы начинали с заглавных букв, чтобы различать обычные функции.
Вы можете использовать только новый?
В приведенном выше примере функциональный автомобиль создается с использованием новых для создания объектов. Есть только один путь? На самом деле, есть и другие способы, давайте перечислим два:
Кода -копия выглядит следующим образом:
Функциональный автомобиль (модель, год, миль) {
this.model = модель;
this.year = год;
this.miles = miles;
// Настройка выходного вывода
this.output = function () {
вернуть это.model + "Left" + this.miles + "km";
}
}
// Метод 1: вызывается как функция
Автомобиль («Дядя», 2009, 20000); // Добавить в окно -объект
console.log (window.output ());
// Метод 2: вызов в рамках другого объекта
var o = new Object ();
Car.call (o, "dudu", 2010, 5000);
console.log (o.output ());
Метод 1 этого кода немного особенный. Если новый вызывает функцию напрямую, это указывает на окно Global Object. Давайте подтвердим это:
Кода -копия выглядит следующим образом:
// как функциональный вызов
var tom = car ("дядя", 2009, 20000);
console.log (typeof tom); // "неопределенный"
console.log (window.output ()); // "Дядя прошел 20 000 километров"
В настоящее время объект Tom не определен, а window.output () правильно выведет результат. Если вы используете новое ключевое слово, такой проблемы нет. Проверка заключается в следующем:
Кода -копия выглядит следующим образом:
// Использование нового ключевого слова
var tom = new Car («Дядя», 2009, 20000);
console.log (typeof tom); // "объект"
console.log (tom.output ()); // "Дядя прошел 20 000 километров"
При насилии
Приведенный выше пример показывает проблему не использовать новый. Итак, есть ли способ для конструктора заставлять новое ключевое слово? Ответ - да, выше код:
Кода -копия выглядит следующим образом:
Функциональный автомобиль (модель, год, миль) {
if (! (Этот экземпляр автомобиля)) {
вернуть новую машину (модель, год, мили);
}
this.model = модель;
this.year = год;
this.miles = miles;
this.output = function () {
вернуть это.model + "Left" + this.miles + "km";
}
}
var tom = new Car («Дядя», 2009, 20000);
var dudu = car ("dudu", 2010, 5000);
console.log (typeof tom); // "объект"
console.log (tom.output ()); // "Дядя прошел 20 000 километров"
console.log (typeof dudu); // "объект"
console.log (dudu.output ()); // "Дуду прошел 5000 километров"
Оценивая, является ли этот экземпляр автомобиля, мы решаем вернуть новый автомобиль или продолжать выполнять код. Если используется новое ключевое слово, (этот экземпляр CAR) является истинной, а следующее назначение параметров будет продолжаться. Если новый не используется, (этот экземпляр автомобиля) является ложным, и новый экземпляр будет возвращен снова.
Оригинальная функция обертки
В JavaScript есть 3 оригинальных функция обертки: число, строка, логическое, иногда оба используются:
Кода -копия выглядит следующим образом:
// Использование оригинальной функции обертки
var s = new String ("my String");
var n = новое число (101);
var b = new Boolean (True);
// рекомендую это
var s = "my String";
var n = 101;
var b = true;
Рекомендуется, используйте эти функции обертки только тогда, когда вы хотите сохранить числовое состояние. Для разницы, вы можете обратиться к следующему коду:
Кода -копия выглядит следующим образом:
// оригинальная строка
var Greet = "Привет";
// Использовать метод split () для разделения
Greet.split ('') [0]; // "Привет"
// добавление новых атрибутов в исходный тип не сообщит об ошибке
Greet.smile = true;
// это значение не может быть получено (мы говорили о том, почему в реализации главы 18 Ecmascript)
console.log (typeof greet.smile); // "неопределенный"
// оригинальная строка
var Greet = new String ("Привет");
// Использовать метод split () для разделения
Greet.split ('') [0]; // "Привет"
// добавление новых атрибутов в тип функции обертки не сообщит об ошибке
Greet.smile = true;
// могут быть доступны новые свойства
console.log (typeof greet.smile); // "логическое"
Суммировать
В этой главе в основном объясняются различия между использованием режима конструктора, методом вызова и новым ключевым словом. Я надеюсь, что все будут обращать на это внимание при его использовании.
Ссылка: http://www.addyosmani.com/resources/ssessentialjsdesignpatterns/book/#constructorpatternjavascript