Quello che cercate è le proprietà non-enumerable di un oggetto (e possibilmente quelle che eredita dal suo prototipo). Non credo che ci sia un modo standard per ottenerli tramite JavaScript.
Se si utilizza un debugger e si ispeziona un oggetto, in genere vengono mostrate tutte le proprietà di un oggetto (non solo quelle enumerabili). Tutti i principali browser hanno ora i debugger integrati: Chrome ha Dev Tools (Ctrl + Shift + I); IE8 e versioni successive hanno "Strumenti di sviluppo F12"; IE7 e precedenti possono essere sottoposti a debugging tramite la versione gratuita di VS.Net; le versioni recenti di Firefox hanno strumenti integrati, per le versioni precedenti è possibile ottenere il plug-in Firebug; Opera ha Dragonfly.
Aggiornamento: Nei commenti sulla questione che hai detto:
sto usando Google Chrome 17 e l'unica proprietà che vedo con console.log
è __proto__
.
Diritto. {}
non ha alcuna proprietà, solo un prototipo. Se fai clic sulla piccola freccia a sinistra di __proto__
, verranno visualizzate le proprietà di __proto__
. hasOwnProperty
, toString
, ecc., Tutte le proprietà {}
derivano dal prototipo (che è Object.prototype
), non dalle proprietà dell'oggetto stesso.
JavaScript utilizza l'ereditarietà prototipo, che significa che un oggetto è supportato da un prototipo. Se si tenta di recuperare il valore di una proprietà che l'oggetto non ha, il motore JavaScript guarderà il prototipo dell'oggetto per vedere se il prototipo ha quella proprietà; se è così, quel valore è usato. Se il prototipo non ce l'ha, il motore guarda il prototipo del prototipo; e così via fino a raggiungere la radice della gerarchia. Questo è il motivo per cui si sente parlare di oggetti con le loro proprietà e proprietà ereditate.
Ecco un esempio:
Ecco una funzione di costruzione. Mettiamo una proprietà sul prototipo che il motore JavaScript assegnerà se usiamo new Foo
per creare un oggetto.
function Foo() {
}
Foo.prototype.bar = 42;
Creiamo un oggetto utilizzando quel costruttore:
var f = new Foo();
f
non ha proprietà a tutti, e tuttavia:
console.log(f.bar); // 42
...poiché poiché f
non ha una proprietà denominata "bar", il motore utilizza il prototipo f
, che è l'oggetto Foo.prototype
.
Ora diamo f
un proprio "bar" di proprietà:
f.bar = 67;
console.log(f.bar); // 67
Ora diamo rimuoveref
s' "bar" di proprietà:
delete f.bar;
Cosa accadrà se cerchiamo di recuperare f.bar
adesso?
console.log(f.bar);
Se lei ha detto 42
, si ottiene il massimo dei voti. Poiché f
non ha più una proprietà chiamata "bar", torniamo indietro per ottenerla dal prototipo.
Si noti che questo rapporto è vivo, quindi:
Foo.prototype.bar = 96;
console.log(f.bar); // 96
Nel 3 ° edizione di ECMAScript (la maggior parte dei browser implementano qualcosa sulla falsariga del 3 ° edizione), l'unico modo per assegnare un prototipo un oggetto è tramite la proprietà prototype
della funzione di costruzione, come sopra. Con la 5 ° edizione, è stato aggiunto un modo più diretto: Object.create
, che è possibile passare un oggetto prototipo direttamente:
var proto = {bar: 42};
var obj = Object.create(proto);
console.log(obj.bar); // 42
proto.bar = 67;
console.log(obj.bar); // 67
Quale browser hai usato? In Google Chrome vedo tutte le proprietà dell'oggetto – antyrat
@antyrat Sto utilizzando Google Chrome 17 e l'unica proprietà che vedo usando 'console.log' è' __proto__'. – Randomblue
Puoi aprire questa proprietà e al suo interno vedrai tutte le proprietà non enumerabili – antyrat