¿Hay algún caso en el que la propiedad del constructor se defina en un objeto/función/clase en sí mismo, o solo aparece en el prototype ? Por ejemplo:
let a = new Array(); console.log(a.hasOwnProperty('constructor'), a.constructor); // false -- constructor not defined on Array, but Array.prototype let f = function(){}; console.log(f.hasOwnProperty('constructor'), f.constructor); // false -- constructor not defined on function, but function.prototypeSería técnicamente posible que tal cosa ocurra, pero es un olor a código.
function Klass(){ this.constructor = Klass; } const k = new Klass(); console.log(k.hasOwnProperty('constructor'), k);(También puede verlo cuando alguien extiende incorrectamente una clase de función )
Se espera que las instancias de objetos tengan una propiedad .constructor en su prototipo , no directamente en la instancia. Si la propiedad está directamente en la instancia, eso causará problemas cuando alguien intente usar uno de los métodos comunes para iterar sobre propiedades propias y encuentre un constructor allí.
Otra razón por la que debería estar en el prototipo y no en el objeto mismo es para aprovechar la herencia prototípica. Si una propiedad puede existir en un objeto, en el prototipo, es mejor hacerlo que duplicar esa propiedad en todas partes, para cada instancia. Y la propiedad del constructor ya está automáticamente en el prototipo, por lo que no debería haber necesidad de alterarla de todos modos.
Por razones similares, los métodos de clase suelen estar en el prototipo de clase cuando es posible, en lugar de duplicarse para cada instancia individual. Es decir, tiene todas las instancias que heredan de un prototipo con el método, en lugar de que todas las instancias tengan su propio método de propiedad. Es decir, no es tan bueno tener
class Klass { constructor() { this.method = () => console.log('method'); } } const k = new Klass(); k.method();con el método duplicado para cada instancia, cuando en su lugar puede hacer
class Klass { method() { console.log('method'); } } const k = new Klass(); k.method();y tenerlo solo en el prototipo.
Mire el documento de Object.prototype.hasOwnProperty .
A diferencia del operador in, este método no comprueba la propiedad especificada en la cadena de prototipos del objeto.
La propiedad del constructor solo existe en Object.prototype . Y la propiedad prototype solo existe en el constructor de objetos.