<!DOCTYPE html>
<html>
<head lang="en"><meta charset="UTF-8"><title>原型链的问题</title>
</head>
<body>
<script>function Humans(){this.clothing=["trousers","dress","jacket"];}function Man(){}//继承了HumansMan.prototype=new Humans();var man1=new Man();man1.clothing.push("coat");alert(man1.clothing);var man2=new Man();alert(man2.clothing);
</script>
</body>
</html>
在这段代码中,创建了两个构造函数 Humans 和 Man,并且通过原型链实现了 Man 继承自 Humans。在 Humans 构造函数中,定义了一个属性 clothing,并将其初始化为一个包含三种衣物的数组。然后,创建了一个 Man 实例 man1,并向其 clothing 属性中添加了一个新元素 "coat"。
问题出现在原型链的共享性质上。由于 Man.prototype 是 Humans 的一个实例,因此 man1 和 man2 实际上共享相同的原型对象。这意味着当修改 man1 的 clothing 属性时,实际上也影响了 man2 的 clothing 属性,因为它们引用的是同一个原型对象。
因此,当运行这段代码时,第一个警报框将显示
["trousers", "dress", "jacket", "coat"],而第二个警报框也将显示相同的结果,因为man2的clothing属性也被修改了。
这种共享原型属性的问题是原型链继承中的一个常见陷阱。为了避免这种问题,通常建议在构造函数中初始化实例特有的属性,而不是将它们放在原型对象中。
如果您希望每个实例都有自己独立的 clothing 属性,您可以在构造函数中初始化它,而不是放在原型对象中。这样就可以避免原型链共享属性的问题。