Для создания любого объекта можно использовать функцию конструктор вида:
function Cat(color, tail) {
this._color = color;
this._tail = tail;
}
Фактически, конструктор является инициализатором свойств объекта.
И затем создать конструктор при помощи оператора new.
var scratchy = new Cat("black", true);
Во время создания объекта контекст this устанавливается на созданный объект, а сам он возвращается в результате выполнения new, если не указано конкретное возвращаемое значение.
scratchy instanceof Cat; // > true
Методы объекта создаются через прототипы:
Cat.prototype.describe = function() {
return this.color + " cat " +
(this._tail ? "with" : "without") + " tail";
}
Если забыть оператор new при создании объекта, то Cat выполнится как обычная функция, возвращающая значение undefined (return отсутствует) и устанавливающая значения _color и _tail для глобального объекта. Чтобы этого не произошло, конструктор желательно создавать с директивой "use strict"; которая выбросит исключение при попытке установки свойств глобального объекта.
Что можно предпринять против "забывчивости"?
1. Создание объекта можно перенести внутрь конструктора и тогда не понадобится использовать new при объявлении - это произойдет в коде конструктора:
function Cat(color, tail) {
"use strict";
if (this instanceof Cat) {
this._color = color;
this._tail = tail;
} else {
return new Cat(color, tail)
}
При вызове без new выполнение пойдёт сначала по ветви else, а потом уже с вновьсозданным объектом по ветви if.
function Cat(color, tail) {
"use strict";
if (this instanceof Cat) {
this._color = color;
this._tail = tail;
} else {
return new Cat(color, tail)
}
При вызове без new выполнение пойдёт сначала по ветви else, а потом уже с вновьсозданным объектом по ветви if.
Комментариев нет :
Отправить комментарий