<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>原型链的问题</title>
</head>
<body>
<script>
function Humans(){
this.clothing=["trousers","dress","jacket"];
}
function Man(){
}
//继承了Humans
Man.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 属性,您可以在构造函数中初始化它,而不是放在原型对象中。这样就可以避免原型链共享属性的问题。
代码示例展示了JavaScript中通过原型链实现Man类继承Humans类时的共享属性问题。通过实例化并修改clothing属性,两个实例man1和man2都受到影响。解决方法是在构造函数中为每个实例初始化独立属性,而非原型对象。

被折叠的 条评论
为什么被折叠?



