Così ho un metodo semplice isPlainObject
che uso per testare letterali oggetto JavaScript:Perché l'aggiunta di una proprietà al prototipo di un oggetto letterale cambia il suo "tipo"?
var isPlainObject = function (obj) {
return typeof obj === "object" && {}.toString.call(obj) === "[object Object]";
};
Ora ho un oggetto semplice:
var obj = {'one': 1, 'two': 2, 'three': 3};
Quando eseguo attraverso la funzione isPlainObject(obj)
funziona come previsto e restituisce true
. La mia domanda arriva da l'aggiunta di una proprietà per il prototipo dell'oggetto:
obj.constructor.prototype.four = 4;
Ora, quando corro isPlainObject(obj)
su obj
restituisce false
. typeof obj
restituisce object
in entrambi i casi. Lo toString
restituisce [object Number]
nella seconda istanza dopo aver aggiunto una proprietà al prototipo.
Che cosa è successo esattamente per cambiare obj
? Cosa sta succedendo?
MODIFICA: Questo accade solo se testato entro i confini di una chiamata di funzione QUnit.
test("each", function() {
_.each([1, 2, 3], function(i,v) {
equal(v, i + 1, 'each iterator provided index and value from array');
});
var obj = {'one': 1, 'two': 2, 'three': 3};
console.log(_.isPlainObject(obj)); // => true
obj.constructor.prototype.four = 4;
console.log(_.isPlainObject(obj)); // => false
});
EDIT: Questa è la console.log ottengo quando accede l'oggetto arguments
array simile ai isPlainObject
.
Guardando il registro sembrerebbe indicare la matrice ha ora due argomenti. Ma la lunghezza continua a leggere 1
.
Quale browser (strano) stai usando? [Mostra 'true' per me ...?] (Http://jsfiddle.net/mattlunn/bR7PX/) – Matt
Sto testando una chiamata a QUnit test(). E hai ragione, ho appena eseguito il test nella console e tutto funziona come previsto. Perché eseguire questo test in QUnit ha questo effetto. Una sorta di problema di ambito? – Xaxis
È vero anche per me. Cosa restituiscono per te 'typeof obj' e' {} .toString.call (obj) '? – Barmar