2013-03-06 14 views
7

Da quello che ho capito, l'ex volontà:In che modo Object.prototype.toString.apply (valore) è diverso da value.toString()?

  1. trovare il metodo toString su Object
  2. chiamata su value ma con this destinata a value

E value.toString() volontà.

  1. trovare il metodo toString da qualche parte nella catena di prototipi value s'
  2. chiamata toString sul valore legato con this come valore attraverso il modello di funzione di invocazione

Quindi la differenza è se c'è un sovrascritto toString metodo in valore ... lo userà.

La mia domanda è:

  1. è che l'unica differenza?
  2. Al contrario, questo modello è il modello standard da utilizzare se vogliamo essere sicuri che stiamo chiamando il metodo Parent e non potenzialmente sovrascritto da Child? (In questo caso Parent = Object, Child = il valore della classe proviene, se stiamo pensando classicamente e method = toString.)
+0

Non capisco il tuo ultimo paragrafo. Cosa stai chiedendo? –

+0

@ExplosionPills ringraziamenti, modificati per essere meglio chiari. – djechlin

risposta

6

Object.prototype.toString.apple(value) consente di chiamare su null, mentre si utilizza null.toString(), si verificherà un errore.

Object.prototype.toString.apply(null); 
>"[object Null]" 

null.toString(); 
>TypeError: Cannot call method 'toString' of null 
+0

Non è proprio questo il punto. La corretta valutazione '.toString()' di 'null' non è' "[oggetto Null]" ', ma piuttosto' "null" '. Quando si passa un valore come contesto di 'Object.prototype.toString', si ottiene il valore della sua proprietà interna * [[Classe]] *, utile per il controllo del tipo. [ECMAScript 9.8 ToString] (http://es5.github.com/#x9.8) –

+0

Domanda successiva: quando digito Object.prototype nella console, vedo Object {} (il che implica che il prototipo è un * vuoto * oggetto), ma suppongo che metodi come toString() siano di fatto implementati in Object.prototype. Quindi, perché mostra che Object.prototype è un oggetto vuoto? – Elisabeth

2

Sì, hai ragione. Di solito non vedo persone che chiamino direttamente lo Object.prototype.toString (di solito ha senso lasciare che gli oggetti sovrascrivano il loro metodo toString) ma è sicuramente molto comune e consigliato per altri metodi come Object.prototype.hasOwnProperty.

+0

Perché è consigliato in quest'ultimo caso? – djechlin

+0

Quando usiamo gli oggetti come "tabelle hash dumb" dovresti usare hasOwnProperty per vedere se è presente una chiave (perché non vogliamo contare le cose nella catena di proprietà). Usando la proprietà "reale" hasOwnProperty di Object.prototype protegge dal caso se qualcuno aggiunge "hasOwnProperty" come chiave alla tabella hash. – hugomg

+1

'Object.prototype.toString' non è un sostituto del metodo' .toString() 'trovato sugli altri prototipi nativi. Non è paragonabile a fare 'Object.prototype.hasOwnProperty' perché non esiste un unico metodo' .hasOwnProperty' definito su nessun altro prototipo. –

5

Object.prototype.toString può essere un metodo diverso value.toString() seconda di ciò che quest'ultimo è.

> Object.prototype.toString.apply("asdfasdf") 
"[object String]" 
> "asdfasdf".toString() 
"asdfasdf" 
> Object.prototype.toString.apply(new Date) 
"[object Date]" 
> (new Date).toString() 
"Tue Mar 05 2013 20:45:57 GMT-0500 (Eastern Standard Time)" 

.prototype[function].apply (o .call o .bind) consentono di cambiare il contesto di un metodo, anche se il contesto non può avere un tale metodo a tutti.

var o = {}; 
o.prototype = {x: function() { console.log('x'); }} 
var y = {} 
o.prototype.x.call(y) 
y.x(); //error! 

... in modo che è quello di dire che

  1. Non è l'unica differenza
  2. Questo non significa necessariamente hanno a che fare con un rapporto tra genitori e figli .. permette solo per chiamare il metodo di un oggetto (o qualsiasi funzione) con un contesto oggetto diverso.
Problemi correlati