【发布时间】:2013-05-09 19:23:20
【问题描述】:
"在 javascript 中,每个对象都有一个指向创建它的对象的秘密链接,形成一个链。当一个对象被要求提供它没有的属性时,它的父对象被询问......不断直到找到属性或到达根对象为止。"
所有,我现在一直认为上面的话是真的,所以我做了一些测试来验证它,我打算像下面这样定义对象的关系。请检查一下。
代码应如下所示。
//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);
由于在Square.prototype中找不到move方法,所以JavaScript会在它的父对象链中找到,我原以为会在Rectangle.prototype中找到,但实际上是在根 Shape.prototype 中找到,所以我无法理解的是为什么 sq.move(1,1) 实际调用 Shape.prototype.move 而不是调用 move 的 Rectangle.prototype 方法?我错过了什么吗?谢谢。
【问题讨论】:
-
应该
Square()构造函数调用Rectangle()而不是Shape()? -
因为
Square是Shape子类而不是Rectangle子类 (?) -
@All 让我试试,我觉得不是问题。
-
Retangle.prototype = new Shape()不是比使用Object.create()更容易吗? -
@All ,
call方法只是调用constructor,与prototype对象无关。顺便说一句,通常继承链总是关于对象的prototype。constructor仅用于构造创建的对象。
标签: javascript javascript-objects