cari

Rumah  >  Soal Jawab  >  teks badan

javascript - Masalah dengan pembina selamat skop js

function Polygon(sides){
                if(this instanceof Polygon){
                    this.sides=sides;
                    this.getArea=function(){
                        return 0;
                    }
                }else{
                    return new Polygon(sides);
                }
            }
            
            function  Rectangle(wifth,height){
                Polygon.call(this,2);
                this.width=this.width;
                this.height=height;
                this.getArea=function(){
                    return this.width * this.height;
                };
            }
            
            var rect=new Rectangle(5,10);
            alert(rect.sides); //undefined

Kod ini ialah contoh P598-599 dalam JS Height 3.
Apa yang saya ingin tanya ialah mengapa amaran tidak ditentukan?

phpcn_u1582phpcn_u15822774 hari yang lalu468

membalas semua(4)saya akan balas

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-19 10:17:29

    Mula

    var rect=new Rectangle(5,10);

    Masukkan Rectangle, ini menunjuk ke objek baharu, dan memanggilnya objek1

    Dilaksanakan ke

    Polygon.call(this,2);

    Masukkan Poligon atas nama objek1

               function Polygon(sides){
                    if(this instanceof Polygon){
                        this.sides=sides;
                        this.getArea=function(){
                            return 0;
                        }
                    }else{
                        return new Polygon(sides);
                    }
                }
    Prototaip

    objek1 ialah Rectangle, jadi pergi ke else

    return new Polygon(sides);

    Masukkan Poligon sekali lagi, ini menunjuk ke objek baharu, dan memanggilnya objek2

    Prototaip objek2 ialah Poligon, jadi objek2 diberi sisi dan getAreasidesgetArea

    回到 object1 的地盘, Polygon.call(this,2); 返回 object2 ,然后…… 然后丢掉了。

                function  Rectangle(wifth,height){
                    Polygon.call(this,2);
                    this.width=this.width;
                    this.height=height;
                    this.getArea=function(){
                        return this.width * this.height;
                    };
                }

    接着赐予 object1 undefinedwidthheightgetArea

    Kembali ke wilayah object1, Polygon.call(this,2); mengembalikan object2, dan kemudian... kemudian hilang.

    function Rectangle(wifth,height){
        Polygon.call(this,2);
        this.width=width;
        this.height=height;
        this.getArea=function(){
            return this.width * this.height;
        };
    }
    Rectangle.prototype = Polygon.prototype

    Kemudian berikan object1 undefined's width, height dan getArea.

    Akhirnya rect dapat object1 🎜 🎜Tambah penyelesaian dan biarkan Rectangle berkongsi prototaip Poligon🎜 rrreee

    balas
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-19 10:17:29

    Dalam Rectangle, Poligon ini menunjuk kepada Rectangle ini Apabila Rectangle digunakan sebagai pembina, ini merujuk kepada contoh Rectangle, iaitu, tepat dalam contoh ini, dan prototaip Poligon bukan pada rantai prototaip bagi. rect. , iaitu, instanceof Polygon ini adalah palsu, jadi Polygon(sides) baru dalam else digunakan, dan sides tidak dilampirkan pada instance, jadi atribut sides tidak wujud pada instance rect.
    Ada juga segi empat tepat(lebar,tinggi), lebar tersalah tulis

    balas
    0
  • 習慣沉默

    習慣沉默2017-05-19 10:17:29

    Dalam contoh anda, Poligon ialah item gangguan dan tidak mempunyai kesan pada Rectangle sama sekali.

    Buang Polygon.call(this,2);Tengok lagi, boleh faham sebabnya

    balas
    0
  • 巴扎黑

    巴扎黑2017-05-19 10:17:29

    • Cetak ini dan anda akan tahu sebabnya

    • this.sides=sides digantung pada Poligon

    • kembalikan Poligon(sisi);//ini bukan lagi Segiempat apabila dipanggil

    function Polygon(sides){
                    if(this instanceof Polygon){
                        this.sides=sides;//sides
                        console.log(this)
                        this.getArea=function(){
                            return 0;
                        }
                    }else{
                        console.log('Polygon'+this)
                        return new Polygon(sides);
                    }
                }
                
                function  Rectangle(wifth,height){
                    Polygon.call(this,2);
                    console.log(this)
                    this.width=this.width;
                    this.height=height;
                    this.getArea=function(){
                        return this.width * this.height;
                    };
                }
                
                var rect=new Rectangle(5,10);
                alert(rect.sides); 

    balas
    0
  • Batalbalas