Por qué los prototipos inicializados manualmente a NULL aún heredan del objeto
-
22-10-2019 - |
Pregunta
Si escribo esto
var o = Object.create(null)
alert(o instanceof Object) // this is false
¿Cómo es que esto termina siendo cierto?
function o() {
}
o.prototype = null
alert(new o() instanceof Object) // this is true
No debería establecer manualmente el prototipo en nulo hacer que herede de nada como objeto. Gracias por adelantado :-)
Solución
Brevemente, si el prototipo de un constructor no es un objeto, entonces se dan instancias Objeto.prototipo como su [[prototipo]].
El detalle está en ECMA-262, §13.2.2 [[construcción]]:
Cuando el método interno [[construct]] para un objeto de función F se llama con una lista posiblemente vacía de argumentos, se toman los siguientes pasos:
- Dejar obj Sea un objeto nativo nativo recientemente creado.
- Establezca todos los métodos internos de obj como se especifica en 8.12.
- Establecer la propiedad interna [[clase]] de obj a "Objeto".
- Establecer la propiedad interna [[extensible]] de obj a verdadero.
- Dejar proto ser el valor de llamar a la [[get]] propiedad interna de F con argumento "prototipo".
- Si tipo (proto) es objeto, establezca la propiedad interna [[prototipo]] de obja proto.
- Si tipo (proto) no es objeto, establece la propiedad interna [[prototipo]] de obj al objeto prototipo de objeto incorporado estándar como se describe en 15.2.4.
- Dejar resultado ser el resultado de llamar a la propiedad interna [[llamada]] de F, Proporcionar obj como el este valor y proporcionar la lista de argumentos pasada en [[construct]] como argumentos.
- Si tipo (resultado) es objeto y luego regresa resultado.
- Devolver obj.
Señalando que en los elementos 6 y 7, null
es tipo nulo (ECMA-262 §8.2), no es lo mismo que typeof null
, cual es objeto.
Otros consejos
Cuando lo instancías así, devuelve un objeto de o
.
Su cadena prototipo (oculta) todavía puntos a Object