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] 5son1.print();输出son1的属性:a = 11,b = [1, 2, 1],c.field = 5。结果为:11 [1, 2, 1] 5son2.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] 5son1.print();输出更新后的son1属性:a = 5,b = [1, 2, 1, 11, 12],c.field = 5。结果为:5 [1, 2, 1, 11, 12] 5son2.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 实例。
