2014-11-26 14 views
5

L'oggetto eredita da Function.prototype che a sua volta eredita da Object.prototype.Javascript :: Perché Object.hasOwnProperty ('caller') restituisce true?

questo è perché internamente, oggetto è in realtà una funzione

function Object(){[native code]} 

, che è il motivo per cui siamo in grado di scrivere codice come

var ob=new Object(); 

oggetto eredita immobili come 'chiamante', 'arity', ecc da Function.prototype

Tuttavia (e questo è ciò che è fonte di confusione)

alert(Object.hasOwnProperty('caller')); //returns TRUE ! surprising 

non dovrebbe restituire false poiché Object eredita effettivamente la proprietà 'chiamante' da Function.prototype?

Allo stesso modo

alert(Function.hasOwnProperty('caller')); 
/*returns True. expected 'false' as Function object has no property of its own and inherits everything from Function.prototype*/ 

alert(Number.hasOwnProperty('caller')); //again returns true, unexpectedly 

Così, qualcuno ha qualche idea sul perché questo sta accadendo?

grazie mille. Spero di non sto suonando ingenuo

EDIT

cercando Object.getOwnPropertyNames(Object) infatti tornato 'caller' come una proprietà direttamente sul oggetto in sé. Quindi

Ma, ora la domanda è perché nella documentazione MDN, 'caller' è menzionato come ereditato dalla funzione. Quindi è sicuramente fonte di confusione.

Quindi questo è un errore nella documentazione? grazie.

EDIT-2

Posso giungere alla conclusione che oggetto ha le proprie

caller, length, ecc proprietà come anche Object.length e Object.__proto__.length non è la stessa. Avrebbe dovuto essere uguale se effettivamente oggetto è stato ereditando proprietà length dalla sua [[prototype]], cioè Function.prototype ma non è il caso

Il fatto è che il motivo per cui lo fa MDN menzione quell'oggetto solo eredita caller, length, arity, ecc dalla sua [[prototype]] oggetto ? è un po 'fuorviante IMHO

+0

In quale motore browser/JS viene eseguito 'Object.hasOwnProperty ('caller')' yield 'true'? Non riesco a riprodurre in Opera. – Bergi

+0

@Bergi in Firefox corrente ad esempio – dsuckau

+0

anche in chrome. – Sarabjeet

risposta

4

Da MDN:

Una funzione creata con una dichiarazione di funzione è un oggetto Function e ha tutte le proprietà, i metodi e comportamento degli oggetti funzionali.

In modalità rigorosa ogni funzione ha una proprietà caller e arguments. Vedere le specifiche ES5 15.3.5 e 13.2.

casi di funzione che corrispondono a funzioni rigorose modalità (13.2) e le istanze delle funzioni create con il metodo Function.prototype.bind (15.3.4.5) hanno proprietà denominato “chiamante” e “argomenti” che gettano una Errore TypeError.

+0

Uh, 'Object' non è probabilmente una funzione creata con una dichiarazione di funzione? – Bergi

+0

ma non sto usando la modalità strict come Non sto usando 'use strict;' In secondo luogo, quindi, anche se è un oggetto Function? la cosa è anche l'oggetto 'Function' stesso non ha alcuna ** proprietà **. Tutto ciò eredita da Function.prototype. Quindi, anche se Object era una funzione, non avrebbe dovuto mostrare 'Object.hasOwnProperty ('caller');' come true – Sarabjeet

+1

@Sarabjeet Non è possibile controllare la creazione di 'Object'. Ovviamente sono creati in modalità rigorosa. Si prega di leggere [13.2 Step 19] (http://www.ecma-international.org/ecma-262/5.1/#sec-13.2). Le proprietà 'caller' e' arguments' saranno aggiunte alla creazione, non ereditate. – dusky

Problemi correlati