2011-12-09 10 views
23

Considérese un objeto, con una cadena de prototipo:equivalente instanceOf para las cadenas Object.create y prototipos de

var A = {}; 
var B = Object.create(A); 
var C = Object.create(B); 

Cómo comprobar en tiempo de ejecución si C tiene un prototipo en su cadena?

instanceof no encaja, ya que está diseñado para funcionar con funciones de constructor, que no estoy usando aquí.

Respuesta

21

Mi respuesta será breve ...

se puede utilizar el método de isPrototypeOf, que estará presente en el caso de que su objeto hereda del prototipo del objeto, como su ejemplo.

ejemplo:

A.isPrototypeOf(C) // true 
B.isPrototypeOf(C) // true 
Array.prototype.isPrototypeOf(C) // false 

Más información se puede leer aquí: Mozilla Developer Network: isPrototypeOf

+1

+1 Solución simple. Aunque sus ejemplos son completamente correctos, sería 'Array.prototype.isPrototypeOf (C)' para verificar si 'C' es una matriz (encontré que su último ejemplo es un poco ambiguo, usar' isPrototypeOf' en una función no suele ser Lo que quieras). – pimvdb

+0

Tiene toda la razón, no quería perder demasiado tiempo ya que una respuesta ya se había dado en ese momento, así que no pensé demasiado en los ejemplos, mi objetivo era solo mostrar el método disponible. .Aún corregiré el ejemplo dado con tu respuesta, ya que como dijiste y estoy de acuerdo, mi último ejemplo es ambiguo, gracias por el aviso =) – Couto

+0

Solo una pregunta rápida: ¿cómo es posible que el objeto no herede de Object? Cualquier objeto tiene una referencia [[Prototipo]] que a través de la cadena de prototipos finalmente conduce a Object.prototype. –

4

Puede repetir la cadena del prototipo llamando al Object.getPrototypeOf recursivamente: http://jsfiddle.net/Xdze8/.

function isInPrototypeChain(topMost, itemToSearchFor) { 
    var p = topMost; 

    do { 

     if(p === itemToSearchFor) { 
      return true; 
     } 

     p = Object.getPrototypeOf(p); // prototype of current 

    } while(p); // while not null (after last chain) 

    return false; // only get here if the `if` clause was never passed, so not found in chain 
} 
+0

1 estaba a punto de publicar un casi idéntica * * respuesta, incluso con el 'hacer-while', que yo no' ver demasiado a menudo Pero el tuyo se convierte en una función, que es más agradable. – RightSaidFred

+0

@RightSaidFred: Gracioso, también estaba pensando en el hecho de que estaba usando la palabra clave 'do' que casi nunca hago. – pimvdb

+0

Me sorprende que no haya una propuesta 'Object.hasPrototype' para ES6 que haga exactamente lo que hace su función. Simplemente parece un complemento natural 'Object.create' como' instanceof' en 'nuevo Constructor'. Incluso podría aceptar una función como segundo argumento, que usaría el 'prototipo' de la función como objetivo. – RightSaidFred

Cuestiones relacionadas