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.prototypeJavaScript はチェーンに続く親オブジェクトでそれを見つけます。 で見つかると思っていましたがRectangle.prototype、実際にはルートShape.prototypeで見つかったので、私が理解できないことのメソッドを呼び出す代わりに、sq.move(1,1)実際に を呼び出すのはなぜですか? 私は何かを逃しましたか?ありがとう。Shape.prototype.movemoveRectangle.prototype

4

2 に答える 2

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 に答える