il model di oggetti javascript: properties; del constructor strano

Trovo il comportmento di questo pezzo di codice puzzolente, perché il constructor del child non è Child ? Può qualcuno spiegarlo a me?

 function Parent() { this.prop1 = "value1"; this.prop2 = "value2"; } function Child() { this.prop1 = "value1b"; this.prop3 = "value3"; } Child.prototype = new Parent(); var child = new Child(); // this is expected console.log(child instanceof Child); //true console.log(child instanceof Parent); //true // what?? console.log(child.constructor == Child); //false console.log(child.constructor == Parent); //true 

Come Pointy ha sottolineato, nella sua risposta

La properties; "constructor" è un riferimento alla function che ha creato il prototipo dell'object, non l'object stesso.

Il modo consueto di far fronte a questo è quello di aumentare la properties; del prototipo dell'object dopo l'assegnazione al prototype

 function Parent() { this.prop1 = "value1"; this.prop2 = "value2"; } function Child() { this.prop1 = "value1b"; this.prop3 = "value3"; } Child.prototype = new Parent(); // set the constructor to point to Child function Child.prototype.constructor = Child; var child = new Child(); // this is expected console.log(child instanceof Child); //true console.log(child instanceof Parent); //true // corrected console.log(child.constructor == Child); // now true console.log(child.constructor == Parent); // now false console.log(Child.prototype.constructor); // Child console.log(Parent.prototype.constructor); // Parent 

Non posso raccomandare il JavaScript Object Oriented JavaScript di Stoyan Stefanov che copre in qualche dettaglio il prototipo e l'inheritance; (get la seconda edizione se è ansible in quanto si affronta alcune critiche della prima edizione).

La properties; "constructor" è un riferimento alla function che ha creato il prototipo dell'object, non l'object stesso.