Страницы

Поиск по вопросам

понедельник, 4 февраля 2019 г.

Что такое constructor в JavaScript и для чего он полезен?

Ни как не могу уложить у себя в голове что такое конструктор в JavaScript ? Для чего мы его изменяем и используем ? К примеру:
var Duck = function(name){ this.name = name; };
Duck.prototype.quack = function(){ return this.name + " Duck: Quack-quack!"; };
var TalkingDuck = function(name){ Duck.call(this, name); }
TalkingDuck.prototype = Object.create(Duck.prototype); TalkingDuck.prototype.constructor = TalkingDuck;
Как эффективно мы можем его использовать на практике ? Обьясните это коротко и понятно, или на оборот :)


Ответ

На практике constructor обычно не используется.

Что это такое:
У любой функции f() есть свойство f.prototype, являющееся объектом со свойством constructor, равным самой функции. То есть:
f.prototype.constructor === f
Это означает, что у любого объекта o, сконструированого функцией f, у которой не заменяли prototype, будет выполнено
o.constructor /* === (new f()).constructor */ === f Кроме того, constructor определен у встроенных объектов (Number, Boolean, String, RegExp, ...) и, вследствие "boxing", даже у примитивных значений (1, "asdf", /reg[eE]xp/). У последних его не имеет смысла менять, т.к. изменение касается временно созданного объекта-оболочки над примитивом, и фактически не имеет эффекта.

Некоторые пытаются использовать это свойство, чтобы в методе объекта использовать this.constructor чтобы определить функцию, с помощью которой можно построить такой же объект (пример).

Однако, если заменять prototype, как в вашем примере:
TalkingDuck.prototype = Object.create(Duck.prototype);
..то TalkingDuck.prototype.constructor уже равен Duck, что означает, что new TalkingDuck() уже будет не будет иметь ожидаемый constructor (=== Duck, а не TalkingDuck). Это лечится дополнительным финтом:
TalkingDuck.prototype.constructor = TalkingDuck;
...но чтобы опираться на то что constructor "правильно" установлен для всех объектов, нужно чтобы для каждого из них был проделан этот финт.
Ну а дальше решайте сами - нужен вам такой constructor или нет.

Комментариев нет:

Отправить комментарий