2013-02-27 29 views
5

Ich muss überprüfen, ob eine Variable eine reine Objektinstanz ist. Beispiel: Ein HTMLElement ist instanceof Objekt. Aber ich muss wirklich überprüfen, ob es nur ein Objekt ist, wie {a: true, b: false} ist. Es kann ein Array nicht validieren.Prüfen, ob ein Objekt ist

Hinweis: Ich kann neuere Funktionen von Chrome verwenden, wenn es besser ist.

+0

Warum müssen Sie dies tun? – hugomg

+0

Suchen Sie wirklich, ob ein Objekt ein Host oder ein natives Objekt ist? Ein HTMLElement ist nicht notwendigerweise eine Instanz des integrierten Object-Objekts. Elemente sind Host-Objekte und müssen daher keinem bestimmten Vererbungsmuster folgen (und einige Browser implementieren keine, noch implementieren sie sie als Instanzen von Object). – RobG

+1

schauen Sie auf http://api.jquery.com/jQuery.isPlainObject/ in der Quelle von jquery http://code.jquery.com/jquery-1.9.1.jsund schließen Sie diese Frage, bis Sie blind sind –

Antwort

8

Überprüfen Sie den Konstruktor. Seems to work in all browsers

if (a.constructor === Object) 
// Good for arrays 
([]).constructor === Object => false 
// Good for HTMLElements 
document.body.constructor === Object => false 
+0

Danke für alle Antworten ... Aber das ist perfekt und schnell für mich. Danke! –

+0

Die Konstruktoreigenschaft kann gesetzt werden, also leicht gefälscht: 'var a = []; a.constructor = Objekt; o.constructor === Objekt; // true' – RobG

+1

@RobG Sicher, es gibt viele Dinge, die Sie tun können, um sich mit JS in den Fuß zu schießen. Sie können auch 'object .__ proto__' spoofieren, was Sie vorgeschlagen haben, aber ich nehme an, das würde tatsächlich etwas zu einem Objekt machen ??? –

2
var proto = Object.getPrototypeOf(obj); 

var protoproto = Object.getPrototypeOf(proto); 

if (proto === Object.prototype && protoproto === null) { 
    //plain object 
} 

Wenn Sie Objekte mit einem null Prototyp erstellen werden, Sie loszuwerden der protoproto bekommen können, und vergleichen Sie nur proto-Object.prototype oder null.

Die Gefahr besteht darin, dass es nicht davor schützt, Object.prototype selbst passiert zu werden, was möglicherweise unbeabsichtigte Erweiterungen von Object.prototype verursacht.


Ein wenig kürzer und sicherer wie folgt aus:

var proto = Object.getPrototypeOf(obj); 

if (proto && Object.getPrototypeOf(proto) === null) { 
    // plain object 
} 

+0

* sidenote: * Mindestanforderungen für die Browser-Version: Firefox 3.5, Chrome 5, IE 9. Siehe: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getPrototypeOf – Raptor

Verwandte Themen