2013-05-22 13 views
9

Próbuję zrozumieć moją prototypowanie javascript & możliwe dziedzictwo, ale na pewno czegoś brakuje. Zacznijmy od prostego konstruktora (licznik function()), dodając prosty mienia i konkretyzacji obiektu:Dlaczego resetowanie prototypu nie powoduje usunięcia właściwości z obiektów?

function Counter() { this.a = "first"; }; 
Counter.prototype.b = "second"; 
var counter = new Counter(); 

w tym momencie counter.a zwraca „pierwszy”, counter.b powroty „drugi” i counter.c jest oczywiście undefined który jest wszystko zrozumiałe. Dodajmy kolejną właściwość prototypu konstruktora:

Counter.prototype.c = "third"; 

Teraz counter.c wróci „trzeciego”. Ale ... my zmieniliśmy nasz umysł, pozwala pozbyć się tych właściwości:

Counter.prototype = {}; 

Stosując prostą logikę, podczas nadpisywania counter prototypu prototype własność, będziemy tracić właściwości counter które dodaliśmy do wcześniej Counter.prototype. Ale tak nie jest - counter.c Zwraca "trzeci". Jestem tutaj zagubiony. Więc ... spróbujmy zastąpić wartość:

Counter.prototype.c = "fourth hohoho"; 

Nic się nie zmienia, counter.c nadal zwraca "trzeci".

Dlaczego nie udało się usunąć właściwości? czego mi brakuje?

+0

Spójrz jak prototypy działają w JavaScript. – mash

+0

Konstruktor jedynie ustanawia relację między nowym obiektem a obiektem '.prototype' konstruktora. Po tym etapie konstruktor nie ma większego znaczenia. Istotna jest relacja między tymi dwoma obiektami. –

+0

Duh, okazuje się, że to takie trywialne. –

Odpowiedz

11

Podczas tworzenia obiektu, o odniesienia jego prototypu obiektu jest dodawany do prototypu.

Możesz augment, że prototyp obiektu, a ponieważ instancje współużytkują odniesienia, te zmiany zostaną odzwierciedlone w istniejących instancjach.

Jeśli jednak zastąpi obiekt prototypowy, utworzone wcześniej instancje nadal zawierają odwołanie do oryginalnego obiektu prototypu.

To samo, co się dzieje z tym kodem:

var a = {}; 
var b = a; 

a.foo = 'bar'; // augment 'a' 
b.foo === 'bar'; // true 

a = {};   // overwrite 'a' 
b.foo === 'bar'; // still true 
8

Można dynamicznie dodawać/usuwać właściwości z obiektu prototypowego, ale nie można zastąpić obiektu prototypu wystąpień, które zostały już utworzone. W twoim przykładzie instancje utworzone po zastąpieniu właściwości prototypu konstruktora otrzymają nowy prototyp, ale te utworzone wcześniej zachowają odniesienie do poprzedniego obiektu.

Jeśli chcesz usunąć jakąś właściwość od prototypu, usuń je z oryginalnego obiektu, za pomocą operatora delete:

delete Counter.prototype.c; 
0

Czy jesteś tego pewien? Spróbuj:

function fa() {this.a=1} 
 
var fb = new fa(); 
 
fa.a = 2; 
 
fa.prototype.a = 3; 
 
var fc = new fa(); 
 
console.log (fa.a, fb.a, fc.a);
Z tego, co mówisz, powinien wydrukować 2 1 3 ale drukuje 2 1 1

+0

Nie, nie powinno. Pytanie brzmiało, dlaczego tworzenie nowego prototypowego obiektu nie spowodowało wyczyszczenia prototypu w uprzednio utworzonym obiekcie. I tutaj zamiast "3" napisano "1", ponieważ aby uzyskać wartość własności "a", obiekt najpierw sprawdza jego istnienie i wartość w obiekcie, a następnie w łańcuchu prototypów. –

Powiązane problemy