"In javascript, every object has a secret link to the object which created it,forming a chain. When an object is asked for a property that it does not have,its parent object is asked... continually up the chain until the property is found or until the root object is reached."
All , I always think the above words is truth even now, So I did some test to verify it , I intended to define the relationship of objects like below. please review it .
The code should look like below .
//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);
Since the move
method can't be found in the Square.prototype
, So JavaScript will find it in its parent objects following the chain, I had thought It will be found in the Rectangle.prototype
, but actually it is found in the root Shape.prototype
, So What I can't understand is why sq.move(1,1)
actually call the Shape.prototype.move
instead of calling the move
method of Rectangle.prototype
? Did I missed something ?thanks.
You just overwritten your Rectangle.prototype
which already had move
. Since you have overwritten it, the move
you attached is no longer there, that's why Shape
's move is used.
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);
Create the prototype object first, before adding to it.
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.move = function (x, y) {
this.x += x;
this.y += y;
alert('Rectangle move');
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With