Ни как не могу уложить у себя в голове что такое конструктор в 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 или нет.
Комментариев нет:
Отправить комментарий