function Father() {this.a = 1;this.b = [1, 2, this.a];this.c = { field: 5 };this.print = function () {console.log(this.a, this.b, this.c.field);};
}function Son() {this.a = 2;this.update = function () {this.b.push(this.a);this.a = this.b.length;this.c.field = this.a++;};
}Son.prototype = new Father();
var father = new Father();
var son1 = new Son();
var son2 = new Son();
son1.a = 11;
son2.a = 12;
father.print();
son1.print();
son2.print();
son1.update();
son2.update();
father.print();
son1.print();
son2.print();
1 [ 1, 2, 1 ] 5
11 [ 1, 2, 1 ] 5
12 [ 1, 2, 1 ] 5
1 [ 1, 2, 1 ] 5
5 [ 1, 2, 1, 11, 12 ] 5
6 [ 1, 2, 1, 11, 12 ] 5
代码执行过程及结果分析
-
定义
Father
和Son
构造函数:Father
构造函数初始化属性a
(值为1),b
(值为[1, 2, this.a]
,即[1, 2, 1]
),c
(对象{ field: 5 }
),以及print
方法。Son
构造函数初始化属性a
(值为2)和update
方法。Son.prototype = new Father();
使得Son
的实例对象能够继承Father
中定义的a
、b
、c
和print
。
-
实例化对象:
var father = new Father();
创建了一个Father
的实例father
,其属性值为a = 1
,b = [1, 2, 1]
,c = { field: 5 }
。var son1 = new Son();
和var son2 = new Son();
创建了两个Son
的实例son1
和son2
。由于继承了Father
,它们各自拥有独立的a
值(由Son
构造函数初始化为2)和独立的b
、c
的引用(通过继承Father
的实例化对象)。因此,son1
和son2
的初始属性为a = 2
,b = [1, 2, 1]
,c = { field: 5 }
。
-
修改属性:
son1.a = 11;
将son1
的a
属性设置为11。son2.a = 12;
将son2
的a
属性设置为12。
-
调用
print
方法:father.print();
输出father
的属性:a = 1
,b = [1, 2, 1]
,c.field = 5
。结果为:1 [1, 2, 1] 5
son1.print();
输出son1
的属性:a = 11
,b = [1, 2, 1]
,c.field = 5
。结果为:11 [1, 2, 1] 5
son2.print();
输出son2
的属性:a = 12
,b = [1, 2, 1]
,c.field = 5
。结果为:12 [1, 2, 1] 5
-
调用
update
方法:-
son1.update();
执行以下操作:this.b.push(this.a);
将son1.a
(即11)添加到b
中,因此son1.b
变为[1, 2, 1, 11]
。this.a = this.b.length;
将son1.a
更新为b
的长度(4)。this.c.field = this.a++;
将son1.c.field
设置为a
(即4),然后自增a
为5。- 更新后,
son1.a = 5
,son1.b = [1, 2, 1, 11]
,son1.c = { field: 4 }
。
-
son2.update();
执行以下操作:this.b.push(this.a);
将son2.a
(即12)添加到b
中,因此son2.b
变为[1, 2, 1, 11, 12]
。this.a = this.b.length;
将son2.a
更新为b
的长度(5)。this.c.field = this.a++;
将son2.c.field
设置为a
(即5),然后自增a
为6。- 更新后,
son2.a = 6
,son2.b = [1, 2, 1, 11, 12]
,son2.c = { field: 5 }
。
-
-
再次调用
print
方法:father.print();
仍然输出原始的father
属性:a = 1
,b = [1, 2, 1]
,c.field = 5
。结果为:1 [1, 2, 1] 5
son1.print();
输出更新后的son1
属性:a = 5
,b = [1, 2, 1, 11, 12]
,c.field = 5
。结果为:5 [1, 2, 1, 11, 12] 5
son2.print();
输出更新后的son2
属性:a = 6
,b = [1, 2, 1, 11, 12]
,c.field = 5
。结果为:6 [1, 2, 1, 11, 12] 5
在这个示例中,son1
和 son2
实例共享了 Father
原型中的 b
和 c
引用,因此 update
方法对 b
数组的修改会影响到所有 Son
实例。