2012-12-05 11 views
8
var p = function() { 
    this.show = function() { 
     alert('hello world!!!'); 
    } 
} 

p.prototype.show = function() { 
    alert('haha'); 
} 

var o = new p(); 
o.show(); 

Ostrzega "hello world!!!", dlaczego?Dlaczego funkcja zadeklarowana w prototypie nie nazywa się?

Czy mogę zmodyfikować metodę prototypu, jeśli tak, w jaki sposób?

+1

Bardzo dokładne wyjaśnienie: http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript –

+1

FYI: Możesz zadzwonić do metody prototypowej, jeśli potrzebujesz: 'p. prototype.show.call (o) ' – Prinzhorn

Odpowiedz

7

Dzieje się tak, ponieważ określona funkcja zdefiniowana w konstruktorze zastępuje tę, która jest dziedziczona przez prototyp.

Od EcmaScript specification:

Każdy obiekt stworzony przez konstruktora ma pośrednie odniesienie (zwany prototyp obiektu), aby wartości „prototypu” własności swojego konstruktora. Co więcej, prototyp może mieć niezerowe odniesienie do jego prototypu, i tak dalej; nazywa się to łańcuchem prototypowym . Kiedy odwołuje się do właściwości w obiekcie, , odwołanie jest do właściwości tej nazwy w pierwszym obiekcie w prototyp łańcucha, który zawiera właściwość o tej nazwie. W innych słowach najpierw przedmiot wymieniony bezpośrednio jest badany pod kątem takiej właściwości ; jeśli ten obiekt zawiera nazwaną właściwość, jest to właściwość , do której odnosi się odwołanie; jeśli ten obiekt nie zawiera nazwanej właściwości, prototyp dla tego obiektu jest badany następująco: ; i tak dalej.

W skrócie: szukając funkcji (lub dowolnej właściwości według jej nazwy), zaczynasz od obiektu, a następnie idziesz w górę łańcucha prototypów.

+1

świetna odpowiedź =) –

3

Zastępujesz swoją metodę prototype.show w funkcji p.

1

W języku JavaScript po rozwiązaniu właściwości silnik najpierw sprawdza właściwości obiektu. W twoim przykładzie obiekt będzie reprezentowany przez this. Jeśli znajdzie właściwość, w tym przypadku show (Zapamiętaj funkcje mogą być właściwościami) używa tej właściwości. Jeśli właściwość nie zostanie znaleziona, iteruje łańcuch prototypów w celu rozwiązania problemu.

Powiązane problemy