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 :-)

¿Fue útil?

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:

  1. Dejar obj Sea un objeto nativo nativo recientemente creado.
  2. Establezca todos los métodos internos de obj como se especifica en 8.12.
  3. Establecer la propiedad interna [[clase]] de obj a "Objeto".
  4. Establecer la propiedad interna [[extensible]] de obj a verdadero.
  5. Dejar proto ser el valor de llamar a la [[get]] propiedad interna de F con argumento "prototipo".
  6. Si tipo (proto) es objeto, establezca la propiedad interna [[prototipo]] de obja proto.
  7. 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.
  8. 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.
  9. Si tipo (resultado) es objeto y luego regresa resultado.
  10. 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

Prototype

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top