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? ?
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,son2
的name
值是通过原型链查找找到的,如果对son1.name进行赋值,那么相当于给son1这个实例添加了name
属性,当然再次打印son1.name
时取到的值是属于son1的name
值,而打印son2.name
,则会去原型链上找name
,这个时候找到的是Father
的name
值,因此两个值不同,可能会给你造成没有共用的错觉。值得注意的是,如果
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].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
Pada ketika ini, nilai contoh diambil. Hanya apabila Son tidak mempunyai atribut yang sepadan, ia akan dicari dalam rantai prototaip.