Конструкторы в JavaScript также отличаются от других языков. Любая функция, вызванная через ключевое слово, может рассматриваться как конструктор.
Внутри корпуса конструктора это указывает на недавно созданный объект. Если в корпусе конструктора не отображается обратное выражение, то мы вернем это по умолчанию, то есть недавно созданный объект.
Кода -копия выглядит следующим образом:
функция foo () {
this.bla = 1;
}
Foo.prototype.test = function () {
console.log (this.bla);
};
var test = new foo ();
Приведенный выше код вызывает Foo в качестве конструктора и указывает на прототип недавно созданного объекта (__proto__) на foo.prototype.
Если мы определим возвращаемое выражение в конструкторе, конструктор вернет все выражение, но это возвратное выражение должно быть объектом.
Кода -копия выглядит следующим образом:
функция bar () {
возврат 2;
}
новый бар (); // новый объект
функциональный тест () {
this.value = 2;
возвращаться {
Foo: 1
};
}
новый тест (); // возвращенный объект
Если новая опущена, функция не может вернуть новый объект.
Кода -копия выглядит следующим образом:
функция foo () {
this.bla = 1; // устанавливается на глобальный объект
}
Foo (); // неопределенный
Приведенный выше пример также может работать в некоторых сценариях, но из -за рабочего механизма этого в JavaScript это будет указывать на глобальный объект здесь.
Заводская модель
Чтобы иметь возможность использовать новое ключевое слово, конструктор должен будет отобразить возвратное значение.
Кода -копия выглядит следующим образом:
функция bar () {
var value = 1;
возвращаться {
Метод: function () {
возвращаемое значение;
}
}
}
Bar.prototype = {
foo: function () {}
};
новый бар ();
Бар();
В приведенном выше примере эффект вызова функциональной панели без использования новой, и будет возвращен недавно созданный объект, содержащий метод метода, что на самом деле является закрытием.
Здесь следует отметить, что New Bar () не будет возвращать bar.prototype, но вместо этого будет прототипом объекта функции метода внутри возврата.
В приведенном выше примере нет различий в функциональности между использованием новой или нет.
Создать новые объекты через заводский режим
Нам часто напоминают не использовать новое, потому что, как только вы забудете о его использовании, это вызовет ошибки.
Чтобы создать объект, мы предпочитаем использовать заводской шаблон и построить новый объект в заводском шаблоне.
Кода -копия выглядит следующим образом:
функция foo () {
var obj = {};
obj.value = 'blub';
var private = 2;
obj.somehethod = function (value) {
this.value = значение;
}
obj.getPrivate = function () {
вернуть частное;
}
вернуть OBJ;
}
Хотя приведенный выше пример код менее подвержен ошибкам, чем при использовании нового, и будет более удобным при использовании частных переменных, есть некоторые недостатки:
Поскольку объекты прототипа не могут быть переданы, требуется больше памяти.
Для достижения наследования заводской шаблон требует копирования всех методов другого объекта или использования его в качестве прототипа нового объекта.
Отказ от цепочки прототипа - это просто избежать использования нового, что противоречит духу языка JavaScript.
Суммировать
Хотя использование нового может быть более подверженным ошибкам, это не является причиной отказаться от использования прототипов цепочек. Что касается того, какой метод в конце концов зависит от потребностей приложения. Лучший способ - выбрать стиль и придерживаться его.
Проще говоря, конструктор должен инициализация объекта экземпляра, а свойство прототипа объекта наследует объект экземпляра.