In primo luogo, la rappresentazione function Empty() {}
è V8.
Nel V8, l'oggetto Function.prototype
ha "Empty
"come il valore della proprietà Function.prototype.name
, quindi credo che probabilmente si sta utilizzando Console per gli sviluppatori del Chrome, e visualizza il nome della funzione in questo modo.
Il name
proprietà di oggetti funzione è non-standard
(non fa parte di ECMA-262), è per questo che noi vediamo le differenze tra le implementazioni.
Ora, Function.prototype
è una funzione, che restituisce sempre undefined
e in grado di accettare qualsiasi numero di argomenti, ma perché? Forse solo per coerenza, ogni costrutto integrato Il prototipo di tor è così, è un oggetto Number.prototype
Number
, Array.prototype
è un oggetto Array
, RegExp.prototype
è un oggetto RegExp
, ecc ...
L'unica differenza (per esempio, tra un qualsiasi oggetto funzione e Function.prototype
) è che ovviamente Function.prototype
eredita da Object.prototype
.
sembra tutto in javascript partire da Object.prototype, ho ragione su questo?
Beh, hai ragione Object.prototype
è l'ultimo oggetto della catena di prototipi maggior parte degli oggetti, ma in ECMAScript 5, si può anche creare oggetti che non ereditano da nulla (proprio come Object.prototype
è), e formare un altro catena di ereditarietà, ad esempio:
var parent = Object.create(null),
child = Object.create(parent);
Object.prototype.isPrototypeOf(parent); // false
Object.getPrototypeOf(parent); // null
Object.getPrototypeOf(Object.prototype); // null
La risposta a questo enigma è quella Function .__ proto __.__ proto__ === Object.prototype. Ma non ci arriverai attraverso Function.constructor.prototype, perché è stato impostato su undefined (o non impostato affatto). – Stefan
+1 Penso sempre che il modo più semplice per spiegare qualcosa sia disegnare una figura/diagramma e lasciarlo parlare. Grazie per aver allegato lo schema qui! –