Зачем переопределять поле constructor при наследовании

В примере наследования поле Child.prototype.constructor затираетсяся на Parent

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 // 1)**

Но в результате хоть с использованием строки 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
2 симпатии