masalah warisan javascript
迷茫
迷茫 2017-07-05 10:47:40
0
3
663

Kod adalah seperti berikut:

        function Father(){
            this.name = true;
            this.array = [];
        }
        Father.prototype.getFatherValue = function(){
            return this.property;
        }
        function Son(){
            this.sonProperty = false;
        }
        //继承 Father
        Son.prototype = new Father();
        var son1 = new Son();
        var son2 = new Son();

Atribut tatasusunan Bapa akan dikongsi oleh son1 dan son2, tetapi atribut nama tidak akan dikongsikan, kedua-dua son1 dan son2 akan pergi ke Son.prototype untuk mencari atribut nama juga harus dikongsi . Kenapa tidak? ?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

membalas semua(3)
为情所困

Oleh kerana tatasusunan adalah jenis rujukan, untuk father(new Father()),son1,son2,这三个实例来说,他们array保存的都是[]这个数组的引用,所以只要其中一个修改了,顺着引用找到内存中的数组就会修改,修改的就是同一个数组。而name = true,这个name是基本类型,在分别new实例的时候,会在内存中各开辟一块区域内存放它的值,因此上述三个实例的name对应的是不同内存区域的值,所以修改了就不会互相影响。
看来楼上的一些回答后,思考了一下,发现我的理解,我的答案是有错的。保留原答案,下面更正一下。
关于数组那一块没有问题,问题在name这个属性,对于son1,son2来说,他们是没有name这个属性的,所以在new的时候,应该是没有为他们的name开辟内存空间的。只有father这个实例有。
son1,son2name值是通过原型链查找找到的,如果对son1.name进行赋值,那么相当于给son1这个实例添加了name属性,当然再次打印son1.name时取到的值是属于son1的name值,而打印son2.name,则会去原型链上找name,这个时候找到的是Fathername值,因此两个值不同,可能会给你造成没有共用的错觉。
值得注意的是,如果son1.array[0] = 1这么赋值的话,那么对三个实例的array都会有影响,如果是son1.array = [1], tugasan sedemikian tidak akan berlaku, kerana pada masa ini tatasusunan mengekalkan rujukan kepada alamat memori tatasusunan baharu [1].

学霸
son1.array.push(1)
son1.array // [1]
son2.array // [2]

son1.array = [2]
son1.array // [2]
son2.array // [1]

Anda kata tatasusunan dikongsi?

小葫芦

Kenapa dikatakan name atribut tidak akan dikongsi?

Pewarisan rantai prototaip bermaksud mencari di sepanjang rantaian prototaip sehingga ia menjumpainya dan mengembalikan nilai ini Jika ia tidak menemuinya, ia akan kembali undefined.

Jika kita memberikan nilai kepada Anak

son1.name = 'aa';
son2.name = 'bbb';

Pada ketika ini, nilai contoh diambil. Hanya apabila Son tidak mempunyai atribut yang sepadan, ia akan dicari dalam rantai prototaip.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!