Функции в JS могут использоваться в трёх ролях:
1. Собственно функции
2. Методы
3. Конструкторы
Функция-метод практически непригодна к использованию как обычная функция, особенно если использует this, т.к. в случае вызова вне контекста объекта this будет указывать на глобальный объект (или будет равен undefined в strict mode).
Основной способ использования конструктора - вызов его для создания нового объекта с ключевым словом new. Использование без new является ошибкой, о способах противодействия этому можно узнать в отдельном разделе блога.
Конструктор при вызове с new неявно получает новый объект при вызове (на него ссылается this) и неявно возвращает новый объект, если return не используется в коде конструктора или же если return возвращает не объект.
Фактически, конструктор может вернуть произвольный объект любого типа, если в качестве аргумента оператора return будет использоваться объект:
mouse = { name: "Jerry", likesCheese: true, voice: function() { console.log("pi-pi-pi") } };
function Cat(name) {
this.name = name;
return mouse;
}
tom = new Cat("Tom");
tom.name; // > "Jerry"
tom.voice(); // > pi-pi-pi
tom instanceof Cat; // > false
Одно из применений для подобного поведения - паттерн Singleton, позволяющий в конструкторе реализовать создание только единственного экземпляра объекта.
function Singleton() {
if ( Singleton.instance ) {
return( Singleton.instance );
}
return ( Singleton.instance = this );
}
1. Собственно функции
2. Методы
3. Конструкторы
Функция-метод практически непригодна к использованию как обычная функция, особенно если использует this, т.к. в случае вызова вне контекста объекта this будет указывать на глобальный объект (или будет равен undefined в strict mode).
Основной способ использования конструктора - вызов его для создания нового объекта с ключевым словом new. Использование без new является ошибкой, о способах противодействия этому можно узнать в отдельном разделе блога.
Конструктор при вызове с new неявно получает новый объект при вызове (на него ссылается this) и неявно возвращает новый объект, если return не используется в коде конструктора или же если return возвращает не объект.
Фактически, конструктор может вернуть произвольный объект любого типа, если в качестве аргумента оператора return будет использоваться объект:
mouse = { name: "Jerry", likesCheese: true, voice: function() { console.log("pi-pi-pi") } };
function Cat(name) {
this.name = name;
return mouse;
}
tom = new Cat("Tom");
tom.name; // > "Jerry"
tom.voice(); // > pi-pi-pi
tom instanceof Cat; // > false
Одно из применений для подобного поведения - паттерн Singleton, позволяющий в конструкторе реализовать создание только единственного экземпляра объекта.
function Singleton() {
if ( Singleton.instance ) {
return( Singleton.instance );
}
return ( Singleton.instance = this );
}
Только для такой (или подобной) реализации объекта две переменных, создаваемых через new, будут ссылаться на один и тот же объект, а следовательно будут равны.
var a = new Singleton();
var b = new Singleton();
a === b; // > true
Во всех остальных случаях при создании объектов даже одного типа (даже пустых) они не являются равными.
var c = {},
d = {};
c === d; // > false
Комментариев нет :
Отправить комментарий