Object.getPrototypeOf(..)devuelve el prototipo (es decir, el valor de la propiedad interna [[Prototipo]]) del objeto especificado. Entonces, lo siguiente tiene sentido.
const prototype1 = {}; const object1 = Object.create(prototype1); console.log(Object.getPrototypeOf(object1) === prototype1); // logs trueIncluso esto se ve bien
function fn() { } Object.getPrototypeOf(fn) == Function.prototype // logs truePero estoy un poco confundido por qué
Object.getPrototypeOf(Object) == Function.prototype // logs truePor favor explique
Algunos puntos a considerar:
Object es una función. Se puede utilizar para convertir una primitiva en un objeto. Like Object("test") creará una instancia de String .
El constructor de funciones es Function . No se hace comúnmente, pero puede crear una función llamando a este constructor. Por ejemplo: new Function("alert('test')") devuelve una función que, cuando se llama, mostrará una alerta.
Las funciones que se crean con sentencias de function , expresiones, sintaxis de función de flecha,... también tienen como constructor esta Function . Entonces, por ejemplo, eval.constructor === Function es una expresión verdadera. Lo mismo ocurre con Object.constructor === Function . Puede hacer esto para cualquier función.
Como todo constructor, Function tiene una propiedad prototype . Ese objeto define las propiedades y los métodos del prototipo que heredan todas las funciones. Podemos encontrar ese objeto prototipo a través Function.prototype , o podemos encontrarlo tomando una instancia de Function (es decir, una función) y obteniendo su objeto prototipo. Esto lo hacemos llamando a Object.getPrototypeOf en una función específica.
Y entonces podemos ver que todos los siguientes son iguales:
var a = Object.getPrototypeOf(eval); var b = Object.getPrototypeOf(parseInt); var c = Object.getPrototypeOf(function () {}); var d = Object.getPrototypeOf(RegExp); var e = Object.getPrototypeOf(Object); var f = Function.prototype; // All true: console.log(a === f, b === f, c === f, d === f, e === f);Todo en JavaScript hereda de Object.prototype . Por eso se dice que todo en JavaScript son objetos. Incluso las funciones y las matrices son objetos ocultos.
Entonces Object.prototype es el prototipo de:
Function.PrototypeArray.Prototype Function.Prototype es el prototipo de Function y Array :
Array.prototype.prototype == Function.Prototype // true Function.prototype.prototype == Function.Prototype // true Y nuevamente, Array y Function heredan de Object.prototype :
Object.getPrototypeOf(Array.prototype) == Object.prototype // true Object.getPrototypeOf(Function.prototype) == Object.prototype // true Así que para volver a tu pregunta. El prototipo de Object es Object.prototype . Y Object.prototype es el prototipo de Function.prototype , por lo tanto:
Object.getPrototypeOf(Object) == Function.prototype // true JavaScript es como un árbol genealógico: Object.prototype tuvo un bebé llamado Function.prototype . Function.prototype luego tuvo sus propios bebés llamados Array y Function. Y luego sigue matrices, clases, etc. Al final, todo conduce de nuevo a Object