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.
(-10/3) jest liczbą, ale nie numer. – simon
@simon Ale metoda 'integer()' jest zdefiniowana w 'Number', prawda? Jeśli (-10/3) nie jest "liczbą", dlaczego może wywoływać 'integer()'? – ChandlerQ
'-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