2009-05-22 7 views
20

Ho un oggetto JavaScript personalizzato che creo con new, e assegnare le proprietà a base di argomenti di creazione:Qual è il modo corretto di verificare l'esistenza di una proprietà su un oggetto JavaScript?

function MyObject(argument) { 
    if (argument) { 
     this.prop = "foo"; 
    } 
} 
var objWithProp = new MyObject(true); // objWithProp.prop exists 
var objWithoutProp = new MyObject(false); // objWithoutProp.prop does not exist 

Qual è il modo corretto per verificare l'esistenza della prop proprietà degli oggetti? Ho visto le seguenti modalità utilizzate, ma non sono sicuro se uno di questi modi è il modo migliore:

  • if (obj.prop) {}
  • if (obj.hasOwnProperty("prop")) {}
  • if ("prop" in obj) {}

In particolare, ho' m interessato solo a testare se la proprietà è definita esplicitamente per questo oggetto, non nella catena del prototipo. Inoltre, il valore non verrà mai impostato su null o undefined, ma potrebbe essere qualcosa come un oggetto o una matrice vuoti. Tuttavia, se vuoi includere quale sia la via corretta, se questo è il caso, sentiti libero.

risposta

29

hasOwnProperty è esattamente quello che stai cercando, dal momento che si specifica "se la proprietà è definita esplicitamente per questo oggetto, non nella catena del prototipo". Per https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/hasOwnProperty, "Questo metodo può essere utilizzato per determinare se un oggetto ha la proprietà specificata come proprietà diretta di tale oggetto, diversamente dall'operatore in, questo metodo non controlla la catena del prototipo dell'oggetto." - sembra corrispondere esattamente alle tue esigenze!

7

Se si sta cercando una proprietà definita in un oggetto, è possibile utilizzare il metodo hasOwnProperty dell'oggetto. In questo modo:

myObject = new MyObject(); 
// some code 
if (myObject.hasOwnProperty('prop')) { 
    // prop exists 
} 

ma questo è solo per sapere se tale proprietà è definita nell'oggetto stesso, ma non i suoi genitori. quindi se tale proprietà è ereditata dall'oggetto, non puoi testarne l'esistenza in questo modo.

l'altro modo è verificare la proprietà rispetto a un valore non definito. in questo modo:

if (myObject.prop !== undefined) { 
    // prop exists 
} 

ricordiamo di utilizzare l'operatore == invece di = = perché non varierà tra nullo e indefinito, ma == fa!!!!. quindi se il tuo oggetto ha una proprietà ma il valore è null,! = non ti aiuterà. quindi questo test:

if (myObject.prop) { 
} 

potrebbe avere risultati errati se "prop" ha un valore falso o nullo. ma confrontando a undefined con l'operatore! ==, puoi essere certo che valori null/falsi non ti confonderanno.

2

È possibile controllare l'esistenza di un variable come segue:

if (typeof variable === 'undefined' || variable === null) { 
    // Do stuff 
} 

E 'anche può essere usato per properties.