Но в результате хоть с использованием строки 1) ** хоть без нее экземпляр класса Child будет вести себя одинаково.
Собственно зачем использовать Child.prototype.сonstructor = Child ?
javascript core реализован так что в каждом объекте есть свойство constructor и ожидается что оно будет ссылаться на функцию, которая сконструировала этот объект. Чтобы
такое поведение было соблюдено и для объекта, который мы отнаследовали и делается это присваивание.
Единственный случай когда присваивание/неприсваивание этого будет иметь эффект, это когда кто-то попробует написать логику исходя из свойство constructor твоего объекта.
[].constructor === Array // true
prototype имеет ссылку на constructor с самого объявления функции
function Child(a, b){
this.b = b;
}
var c = new Child()
console.log(c.constructor === Child) // true
console.log(Child.prototype.constructor === Child) // true
Перезаписывая объект prorotype мы и перезаписываем конструктор, и получаем поведение объекта которое чуть-чуть отличается от того как себя ведут объекты из core.
function Parent(a){
this.a = a;
}
function Child(a, b){
Parent.call(this. a);
this.b = b;
}
Child.prototype = Object.create(Parent.prototype);
var c = new Child()
console.log(c.constructor === Child) // false :(
console.log(c.constructor === Child) // false :(
console.log(c.constructor === Parent) // true WTF?
С присваивание в constructor ссылки на функцию конструктор это шероховатость убирается, и поведение наследуемого объекта никак не отличается от объектов из core
function Parent(a){
this.a = a;
}
function Child(a, b){
Parent.call(this. a);
this.b = b;
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child
var c = new Child()
console.log(c.constructor === Child) // true
console.log(c.constructor === Child) // true
console.log(c.constructor === Parent) // false