<!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
属性,您可以在构造函数中初始化它,而不是放在原型对象中。这样就可以避免原型链共享属性的问题。