2013-09-05 7 views
6

enter image description hereCzy każdy obiekt w JS ma metodę toString()?

enter image description here

Jeśli to prawda, to dlaczego dzieje się ten błąd? Obiekt req.body nie jest null lub undefined, jak pokazuje zdjęcie.

Używam node-inspector do debugowania aplikacji express.js, to zdjęcie zostało zrobione w Chrome Developer Tools.

konfiguracja ekspresowe:

app.use(express.bodyParser())

Dzięki komentarze, teraz znalazłem req.body jest undefined, ale nowe pytanie, jak ponownie wprowadzić toString prace? Chcę req.body.toString() powrócić ciąg jak poniżej:

enter image description here

Jak ponownie podpisać odpowiednią metodę toString?

Próbowałem delete niezdefiniowany toString, nie dobrze. Zobacz:

enter image description here

+2

Metoda mogła zostać usunięta. Sprawdź to: 'var foo = {}; foo.ToString(); bla.toString = undefined; foo.toString(); '. Uruchom to i zobacz, co się stanie. – Renan

+0

Czy możesz rozwinąć właściwość '__proto__' i załadować kolejny zrzut ekranu? – Bergi

+1

Twój addendum z 'delete' jest trochę czerwonym śledziem. W twoim przykładzie 'a' nigdy nie miało własnej metody' toString'; to zawsze było wynikiem jego prototypu. W związku z tym 'delete' nie ma żadnego skutku, ponieważ' a' nie ma metody 'toString' (tzn.' A.hasOwnProperty ("toString") ma wartość false). – apsillers

Odpowiedz

14

Czy każdy obiekt w JS ma metody toString()?

Nie tylko te, które dziedziczą ją z Object.prototype (jak wszystkie normalne obiekty zrobić) lub zdefiniować go na własną rękę (lub odziedziczy go ze swojego niestandardowego prototypu) zrobić.

Możesz tworzyć takie niezwykłe obiekty przez Object.create(null). Można również nadać obiektowi zwykłą właściwość toString, która cienie odziedziczoną i nie jest funkcją (np. {toString:0}), ale przypuszczam, że spowodowałoby to wyraźny błąd.

W twoim przypadku, wydaje się, że querystring parser wykorzystywane przez bodyParser() ma (miał) rzeczywiście tworzenia obiektów bez prototypów, aby uniknąć maglowania .constructor.prototype gdy stosowano takie parametry. Zobacz qs pullrequest #58 i express issue 1636: Bodyparser not setting object.prototype? (sugerując aktualizację).

Jak zmienić przypisanie właściwej metody toString?

Można po prostu przypisać dowolną funkcję, jak

req.body.toString = function() { return "Hi, I'm a request body"; }; 

ale prawdopodobnie chcesz średnia jeden:

req.body.toString = Object.prototype.toString; 

Inne opcje byłyby redefinicji prototyp poprzez niestandardowym __proto__ nieruchomości (req.body.__proto__ = Object.prototype) lub po prostu zastosowanie samodzielnej funkcji obiektu, zamiast uczynienia z niej metody, takiej jak Object.prototype.toString.call(req.body).

+1

Wyniki 'toString()' również mogą się różnić w zależności od środowiska, więc nawet jeśli jest obecny, warto pamiętać, że jego wyniki mogą być niewiarygodne dla niektórych funkcji. – max

+1

+1, ale zauważ, że 'req.body' wydaje się mieć tutaj prototyp' Object', więc może się zdarzyć, że w konkretnym przypadku OP będzie więcej. Być może ten obiekt deleguje swój "toString" do obiektu prototypowego innego niż obiekt? – apsillers

+1

@apsillers: Tak, to też podejrzewam. Być może metoda niestandardowa 'toString' ciała żądania próbuje wywołać' toString() 'na innym obiekcie ... – Bergi

Powiązane problemy