2013-05-15 10 views
7

"W javascript każdy obiekt ma tajne łącze do obiektu, który go utworzył, tworząc łańcuch. Gdy obiekt jest żądany dla właściwości, której nie ma, jego obiektem nadrzędnym jest zapytałem ... ciągle w górę łańcucha aż do znalezienia właściwości lub do momentu osiągnięcia obiektu głównego "Dziedziczenie metod w łańcuchu prototypów JavaScriptu

Wszystko, zawsze uważam, że powyższe słowa są prawdą nawet teraz, więc zrobiłem test, aby to zweryfikować, ma na celu zdefiniowanie relacji obiektów takich jak poniżej. przejrzyj go.

enter image description here

Kod powinien wyglądać jak poniżej.

 //Shape - superclass 
     function Shape() { 
      this.x = 0; 
      this.y = 0; 
     }; 

     Shape.prototype.move = function(x, y) { 
      this.x += x; 
      this.y += y; 

      alert('Shape move'); 
     }; 

     // Rectangle - subclass 
     function Rectangle() { 
      Shape.call(this); //call super constructor. 
     } 

     Rectangle.prototype.move = function(x, y) { 
      this.x += x; 
      this.y += y; 

      alert('Rectangle move'); 
     }; 

     // Square - subclass 
     function Square(){ 
      Shape.call(this); 
     } 

     Rectangle.prototype = Object.create(Shape.prototype); 
     Square.prototype=Object.create(Rectangle.prototype); 

     var rect = new Rectangle(); 

     var sq= new Square(); 

     sq.x=1; 
     sq.y=1; 
     sq.move(1,1); 

Ponieważ metoda move nie można znaleźć w Square.prototype, więc JavaScript, znajdzie je w swoich obiektach nadrzędnych po łańcuchu, myślałem Okaże się w Rectangle.prototype, ale w rzeczywistości znajduje się w root Shape.prototype, Więc nie mogę zrozumieć, dlaczego sq.move(1,1) nazywa się Shape.prototype.move zamiast wywoływania metody move z Rectangle.prototype? Czy coś przeoczyłem? Dzięki.

+2

powinna 'Square()' 'contructor wezwanie Rectangle()' 'zamiast Shape()'? – nnnnnn

+0

Ponieważ 'Square' jest podklasą' Shape' zamiast podklasy 'Rectangle' (?) – DaGLiMiOuX

+0

@ All Pozwól mi spróbować, myślę, że to nie problem. –

Odpowiedz

5

Właśnie nadpisałeś swoje Rectangle.prototype, które już miało move. Ponieważ został on zastąpiony, nie ma już dołączonego move, dlatego zastosowano ruch Shape.

Rectangle.prototype.move = function(x, y) { 
    this.x += x; 
    this.y += y; 
    alert('Rectangle move'); 
}; 

function Square(){ 
    Shape.call(this); 
} 

//overwritten the prototype 
Rectangle.prototype = Object.create(Shape.prototype); 

Najpierw stwórz prototyp obiektu, zanim go dodasz.

Rectangle.prototype = Object.create(Shape.prototype); 
Rectangle.prototype.move = function (x, y) { 
    this.x += x; 
    this.y += y; 
    alert('Rectangle move'); 
}; 
+1

Nie ma to nic wspólnego z podnoszeniem; kod jest po prostu nadpisuje 'Rectangle.prototype' :) –

+0

@Jack O tak. Jego kod był tak mieszany, że początkowo myślałem, że tak. Dzięki – Joseph

+0

+1 Jesteś zawsze niesamowity! –

2

Przenieś rozszerzenie prototypu w dół. Teraz jesteś przypisując prototyp po rozszerzając go, więc będzie zastąpić rozszerzony jeden

//Shape - superclass 
     function Shape() { 
      this.x = 0; 
      this.y = 0; 
     }; 
     // Rectangle - subclass 
     function Rectangle() { 
      Shape.call(this); //call super constructor. 
     } 
     // Square - subclass 
     function Square(){ 
      Shape.call(this); 
     }  

     Rectangle.prototype = Object.create(Shape.prototype); 
     Square.prototype = Object.create(Rectangle.prototype); 

     Shape.prototype.move = function(x, y) { 
      this.x += x; 
      this.y += y; 

      alert('Shape move'); 
     }; 
     Rectangle.prototype.move = function(x, y) { 
      this.x += x; 
      this.y += y; 

      alert('Rectangle move'); 
     }; 

     var rect = new Rectangle(); 
     var sq = new Square(); 

     sq.x=1; 
     sq.y=1; 
     sq.move(1,1); 
Powiązane problemy