2015-05-03 19 views
9

I już przez niektórych materiałów i nie całkowicie uchwycić pojęcie jeśli chodzi o składni, takich jak:Różnica między Object.prototype.toString.call (arrayObj) i arrayObj.toString()

var arrObj = [1,2,3]; 
Object.prototype.toString.call(arrObj); //Gives "[object Array]" 
arrObj.toString(); // Gives "1,2,3" 

Czym różnią się linie 2 i 3? O ile zrozumiałem, oba wywołują metodę toString z bieżącym obiektem ustawionym na 'arrObj'.

+1

to dlatego, że używasz 'prototyp Object'. Używa tablicy jako obiektu. Musisz użyć 'Array.prototype.toString()' – Downgoat

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain – undefined

+1

Zwróć uwagę, że [Object.prototype.toString()] (https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString) zawsze zwraca '" [typ obiektu] "', gdzie * typ * jest rodzajem natywnego typu obiektu – gengkev

Odpowiedz

10

Od toString jest zdefiniowany w Object.prototype, kto dziedziczy Object będzie domyślnie dostać metodę toString.

Ale, Array obiektów, nadpisuje domyślną metodę toString, aby wydrukować elementy tablicy jako ciąg rozdzielany przecinkami.

Object.prototype.toString nie wie, z jakim typem obiektu faktycznie się zajmuje. Tak więc jest celowo utrzymywany w stanie ogólnym i zawsze drukuje rzeczywisty typ obiektu. Dlatego

console.log(Object.prototype.toString.call(arrObj)); 

drukuje

[object Array] 

który jest typem obiektu przekazany. Ale kiedy robisz arrObj.toString, próbujesz reprezentować tablicę w jej formie String, więc toString jest nadpisywane w obiektach Array, aby wydrukować elementy tablicy jako łańcuch oddzielany przecinkami.

Dlatego oba połączenia są różne.


Ale w przypadku innych obiektów, poszczególnych toString nie jest nadpisane, więc będą używać toString z Object.prototype.toString.Na przykład,

var obj = { 
    1: 2 
}; 

console.log(obj.toString()); 
// [object Object] 

Czytaj przykład w MDN dotyczącą Overriding the default toString method

6

toString jest overridden for Arrays; i Object.prototype.toString jest inny niż Array.prototype.toString.

Aby uzyskać ten sam rezultat z call, użyj go na „poprawny” sposób:

Array.prototype.toString.call(arrObj); // Gives "1,2,3" 
0

Te metody są .call() hacky sposoby leczenia jednego typu jako drugi. Na przykład NodeLists, as Arrays z Array.prototype.forEach. Gdy wywołasz go jako obiekt, "przekonwertuje go" na ciąg znaków obiektu

Array.prototype.toString.call(arrObj); 

Działa idealnie. Object.toString() leczy się dziwnie. Wyobraź kompilator robi coś takiego:

[1, 2, 3] -> { 0: 1, 1: 2, 2: 3 }

Że wróci [Object object]. JavaScript, w przeciwieństwie do innych języków, zawsze znajdzie wyjście, gdy są problemy z typem.


Jeśli piszesz funkcję, można zrobić coś takiego:

function myFunction (input) { 
    window[input.constructor.name].prototype.toString.call(input); 
}