2011-07-29 9 views
22

Czytam kod ATC Douglasa Crockforda JavaScript: Dobre części, i jestem trochę zdezorientowany. W rozdziale 4, w sekcji Rozszerzenia, tworzy skrót do dodawania metody.Rozszerzanie typów w JavaScript

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

Mówi:

przez zwiększanie Function.prototype z „metoda” metoda, już nie trzeba wpisać nazwę właściwości prototypu. Ten kawałek brzydoty można teraz ukryć.

Następnie używa go do dodania metody liczby całkowitej do prototypu liczbowego.

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

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

Jestem trochę mylić tutaj ... ponieważ dodaliśmy „metoda” metodę Funkcja prototypu w , nie Prototyp Number. Według mojej wiedzy obiekt Number nie dziedziczy po prototypie Function (choć może się mylę). Widzę, że to działa, ale nie rozumiem, dlaczego obiekty Number są w stanie wykorzystać tę metodę "metody" do dodania ... metod.

+0

To jest fajne pytanie.Zajęło mi trochę czasu, aby zrozumieć kod, ale w końcu go dostałem. – Paul

+0

dzięki wszystkim za dobre odpowiedzi. teraz ma to sens. –

+2

Następnym pytaniem jest, jaki jest punkt pierwszego fragmentu kodu. Chyba nie rozumiem jego cytatu. W jaki sposób ta metoda "metody" jest wydajniejsza lub lepsza niż bezpośrednie bezpośrednie dodawanie metody do prototypu Number? W ten sposób: Number.prototype.integer = function() { return Math [this <0? "ceil": "floor"] (ten); } –

Odpowiedz

4

Number jest w istocie funkcją. Każdy konstruktor jest funkcją.

Jednym ze sposobów myślenia o typach w javascript jest stwierdzenie, że typ jest po prostu funkcją Foo, która ma właściwość .prototype. Jest to prototyp dowolnego obiektu, który zostanie utworzony za pomocą słowa kluczowego new, jak w new Foo(). Zgodnie z konwencją Foo jest pisane wielką literą, aby wskazać, że jest to konstruktor.

2

Oto przykład, który może pomóc:

var num = Number('1.2'); 
alert(num instanceof Number); // true 
alert(num instanceof Function); // false 
alert(Number instanceof Number); // false 
alert(Number instanceof Function); // true 

Innym sposobem myślenia o tym, że w JavaScript Function ciągnie podwójną funkcję jako typ klasy - rodzaju typów. Dlatego dodaje się metodę do typów.

+1

'alert (num instanceof Number);' Ten jest "fałszem". – ChandlerQ

+0

@ AmareKnight: Cóż ... cholera. To jedna "cecha" z Java, której nie potrzebowałem. –

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

W tym bloku instrukcji utworzono metodę nazywaną metodą dostępną dla wszystkich obiektów poprzez prototypowe dziedziczenie. Funkcje wywodzą się z Function.prototype, który wywodzi się z Object.prototype. W ten sposób łańcuchy i liczby będą miały dostęp do metody Object.prototype zwanej metodą w tej deklaracji.

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

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

W tym drugim bloku są zasadniczo wywołanie metody, która jest już dostępna w prototypie obiektów i przekazywanie wymaganych parametrów w tym przypadku nazwa = „całkowitej” i wartości równej

function() { 
    return Math[this < 0 ? 'ceil' : 'floor'](this); 
    }); 

Wreszcie w ostatnim zestawieniu podajesz parę wartości nazwy dla wyniku -3