Страницы

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

суббота, 4 января 2020 г.

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

#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;


Как эффективно мы можем его использовать на практике ?
Обьясните это коротко и понятно, или на оборот :)
    


Ответы

Ответ 1



На практике 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 или нет.

Ответ 2



Если в двух словах, constructor возвращает ссылку на функцию, которая создала прототип экземпляра. По сути, constructor позволяет динамически управлять созданием объекта. Тем самым обеспечивается большая гибкость. Однако это не работает для примитивных значений (таких как true, 1, "text").

Ответ 3



Дополню: Свойство конструктор не является перечисляемым. Object.getOwnPropertyDescriptor(Duck.prototype, 'constructor') Вот пример.

Ответ 4



Напишите код в Typescript и посмотрите, как он это перевёл в Javascript. Всё станет понятно! Ссылка. Под стандартным ООП я подразумеваю ООП, которое используется в C++/Java/C# ... В Javascript используется прототипное программирования - стиль объектно-ориентированного программирования, при котором отсутствует понятие класса, а наследование производится путём клонирования существующего экземпляра объекта — прототипа.

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

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