2014-11-26 3 views
5

Das Objekt erbt von Function.prototype, das wiederum von Object.prototype erbt.Javascript :: Warum Object.hasOwnProperty ('caller') True zurückgibt?

ist dies, weil intern, Objekt tatsächlich eine Funktion

function Object(){[native code]} 

ist, weshalb wir Code schreiben können, wie

var ob=new Object(); 

Objekt erbt Eigenschaften wie ‚Anrufer‘, ‚arity‘ usw. aus Function.prototype

aber (und das ist, was verwirrend ist)

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

sollte es nicht false zurückgeben, da Object tatsächlich die Eigenschaft 'caller' von Function.prototype erbt?

gleiche Weise

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 

also jemand eine Idee hat, warum dies geschieht?

vielen Dank. Ich hoffe, dass ich nicht naiv

EDIT

versuchen, klingen am Object.getOwnPropertyNames(Object) tatsächlich 'caller' als Eigenschaft direkt am Objekt selbst zurückgegeben. So Object.hasOwnProperty('caller') ist faktisch korrekt

Aber jetzt ist die Frage, warum in MDN-Dokumentation 'caller' als von Function geerbt erwähnt wird. So führt es definitiv zu Verwirrung.

Also ist das ein Fehler in der Dokumentation? danke.

EDIT-2

Kann ich zu dem Schluss, dass seine eigene Objekt hat

caller, length, etc Eigenschaften als auch Object.length und Object.__proto__.length ist nicht das gleiche. Es sollte gleich gewesen, wenn in der Tat Gegenstand wurde Länge Eigenschaft von seinem [[prototype]] vererben, dh Function.prototype aber es ist nicht der Fall

Die Sache ist, warum tut MDN erwähnt, dass nur Objekt erbt caller, length, arity, etc von seinem [[prototype]] Objekt ? es ist ein wenig irreführend, IMHO

+0

In welcher Browser/JS-Engine hat 'Object.hasOwnProperty ('caller')' yield 'true'? Ich kann in Opera nicht reproduzieren. – Bergi

+0

@Bergi in aktuellen Firefox zum Beispiel – dsuckau

+0

in Chrom auch. – Sarabjeet

Antwort

4

Von MDN:

Eine Funktion mit einer Funktionsdeklaration erstellt ist ein Funktionsobjekt und verfügt über alle Eigenschaften, Methoden und Verhalten von Funktionsobjekten.

Im strikten Modus besitzt jede Funktion eine eigene caller und arguments Eigenschaft. Siehe ES5-Spezifikation 15.3.5 und 13.2.

Funktion Instanzen, die Strict-Modus-Funktionen (13.2) und Funktion Instanzen erstellt unter Verwendung der Function.prototype.bind Methode (15.3.4.5) entsprechen haben Eigenschaften „Anrufer“ und „Argumente“, die einen werfen genannt TypeError-Ausnahme

+0

Äh, 'Objekt' ist wahrscheinlich keine Funktion, die mit einer Funktionsdeklaration erstellt wurde? – Bergi

+0

aber ich verwende keinen strikten Modus als Ich verwende nicht 'use strict;' Zweitens, also was auch wenn es ein Function-Objekt ist? das Ding ist sogar das 'Function' Objekt selbst hat keine ** eigene Eigenschaft **. Alles erbt von Function.prototype. Also selbst wenn Objekt eine Funktion war, sollte es noch nicht gezeigt 'Object.hasOwnProperty ('caller');' als wahr – Sarabjeet

+1

@Sarabjeet Sie können die Erstellung von 'Objekt' nicht kontrollieren. Offensichtlich sind sie im strikten Modus erstellt. Bitte lesen Sie [13.2 Schritt 19] (http://www.ecma-international.org/ecma-262/5.1/#sec-13.2). Die Eigenschaften 'caller' und' arguments' werden bei der Erstellung hinzugefügt, nicht geerbt. – dusky

Verwandte Themen