2013-03-27 14 views
6

Czytam książkę Javascript: the Good Parts. Jestem trochę zdezorientowany kiedy czytam kod poniżej:Jaki jest związek między liczbą a funkcją.prototype w javascript?

Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

Number.method('integer',function(){ 
    return Math[this < 0 ? 'ceil' : 'floor'](this); 
}); 

Myślę, że pierwsza część kodu Powyższe oznacza, że ​​każda funkcja w JavaScripcie ma teraz metody zwanej metoda. Ale czy "liczba" jest także funkcją? Dlaczego Number.method ma sens?

Przypuszczam, że Number dziedziczy Number.prototype, który dziedziczy Object.prototype (Number-> Number.prototype-> Object.prototype), ponieważ Number nie ma metody "method" na początku, będzie szukał go wzdłuż prototypowy łańcuch. Ale Function.prototype nie jest w łańcuchu, prawda?

Jaka jest relacja między Number, Number.prototype i Function.prototype?


AKTUALIZACJA I:

rozglądałem się za jakimś dodatkowych informacji i jestem teraz bardziej mylić. Niektórzy mówią, że liczba jest w rzeczywistości funkcją i wydaje się to mieć sens, ponieważ wartość Number instanceof Function to true. Ale wartość (-10/3) instanceof Number to false. Czy to nie jest mylące? Jeśli liczba w matematyce (np. 3, 2,5, (-10/3)) nie jest nawet Number w JavaScript, w jaki sposób (-10/3) może wywołać integer(), która jest metodą z Number? (Poniższa linia pochodzi z tej samej książki)

document.writeln((-10/3).integer()); 

UPDATE II:

Problem rozwiązany, w zasadzie.

Dzięki @ pomocy Xophmeister, obecnie mój wniosek jest taki, że Number może powoływać method ponieważ Number jest konstruktorem tak, że jest ona związana z Function.prototype. Co do tego, dlaczego liczba (3, 2,5, (-10/3)), której typ jest typem pierwotnym w kodzie JavaScript, może wywołać metodę, którą ma obiekt Number, należy odnieść się do this page.

Zasadniczo otrzymałem tę konkluzję z pomocy @ Xophmeistera i drobnych poszukiwań, więc może to nie być wystarczająco precyzyjne. Wszelkie poprawki lub uzupełnienia są mile widziane.

+0

(-10/3) jest liczbą, ale nie numer. – simon

+0

@simon Ale metoda 'integer()' jest zdefiniowana w 'Number', prawda? Jeśli (-10/3) nie jest "liczbą", dlaczego może wywoływać 'integer()'? – ChandlerQ

+0

'-10/3' nie jest obiektem' Number' *, ale ma * typ * 'number'. Myślę, że sekcja 8.6.2 i 9.9 specyfikacji ECMA262 są z tym związane; w szczególności, elementy '[[PrimitiveValue]]' i 'ToObject' wbudowane w JS. Ten wpis na blogu może wyjaśniać rzeczy lepiej: http://javascriptweblog.wordpress.com/2010/09/27/the-secret-life-of-javascript-primitives/ – Xophmeister

Odpowiedz

3

wierzę łańcuch prototyp jest: Object>Function>Number:

Number instanceof Function; // true 
Number instanceof Object; // true 
Function instanceof Object; // true 
+0

'Object instanceof Function' zwraca również" true ". –

+0

Zakładam, że to dlatego, że funkcje są najwyższej klasy obywatelami w JavaScript. – Xophmeister

+0

Podobnie jak w przypadku @ neustroev.ai, "Object instanceof Function" to "true". Czy to znaczy, że obiekt w JavaScript jest funkcją? – ChandlerQ

Powiązane problemy