2011-10-07 11 views
20

Che cos'è la funzione __proto__?

vedo questo bel diagramma e ho fatto alcuni test nel mio browser Chrome, ma non so come spiegarlo:

> Function.prototype 
    function Empty() {} 
> Function.__proto__ 
    function Empty() {} 
> typeof(Empty) 
    "undefined" 

Qual è il function Empty() {}, e perché Function.prototype è un function non è un object proprio come Object.prototype?

Dal diagramma sopra, sembra tutto in JavaScript inizia da Object.prototype, ho ragione su questo?

+0

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

+0

+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! –

risposta

17

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.prototypeNumber, 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 
+0

In realtà sono ancora curioso di sapere perché le console di solito mostrano il tipo di Function.prototype come Function e tutti gli altri tipi RegExp, String, Number as Object. So che l'hai menzionato ma per coerenza ?? Per favore, fai più luce su di esso – Gurjit

6

Per integrare CMS eccellente risposta:

sembra tutto in JavaScript partenza dalla Object.prototype, ho ragione a tale proposito?

Assolutamente, gli oggetti in JavaScript sono concatenati all'Oggetto base. La catena dell'ereditarietà funziona in runtime, quindi se un oggetto di base viene modificato, ogni catena concatenata erediterà le modifiche istantaneamente. Se un oggetto non ha un metodo o una proprietà, l'implementazione di Javascript seguirà la catena del prototipo fino a quando non la troverà o fallirà.

__proto__ è un accessor non standard del prototipo, supportato su browser, ma non da IE. In ogni caso non è pensato per essere utilizzato dal codice dell'applicazione.

Problemi correlati