8

在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);

由于在move中找不到方法Square.prototype,所以 JavaScript 会在其父对象的链下找到,我原以为会在 中找到Rectangle.prototype,但实际上是在根中找到Shape.prototype,所以我无法理解是为什么sq.move(1,1)实际上调用Shape.prototype.move而不是调用move方法Rectangle.prototype?我错过了什么吗?谢谢。

4

2 回答 2

6

你刚刚覆盖了你Rectangle.prototype已经拥有的move. 由于您已覆盖它,因此move您附加的不再存在,这就是Shape使用 's move 的原因。

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);

在添加之前先创建原型对象。

Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.move = function (x, y) {
  this.x += x;
  this.y += y;
  alert('Rectangle move');
};
于 2013-05-15T09:33:56.843 回答
2

向下移动原型的扩展。现在您在扩展原型后分配原型,因此它将覆盖扩展的原型

//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);
于 2013-05-15T09:37:41.390 回答