javascript - Masalah dengan pembina selamat skop js
phpcn_u1582
phpcn_u1582 2017-05-19 10:15:29
0
4
464
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_u1582
phpcn_u1582

membalas semua(4)
曾经蜡笔没有小新

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
淡淡烟草味

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

習慣沉默

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

巴扎黑
  • 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); 
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan