JS面向对象:八.原型链的问题

代码示例展示了JavaScript中通过原型链实现Man类继承Humans类时的共享属性问题。通过实例化并修改clothing属性,两个实例man1和man2都受到影响。解决方法是在构造函数中为每个实例初始化独立属性,而非原型对象。
<!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>

在这段代码中,创建了两个构造函数 HumansMan,并且通过原型链实现了 Man 继承自 Humans。在 Humans 构造函数中,定义了一个属性 clothing,并将其初始化为一个包含三种衣物的数组。然后,创建了一个 Man 实例 man1,并向其 clothing 属性中添加了一个新元素 "coat"

问题出现在原型链的共享性质上。由于 Man.prototypeHumans 的一个实例,因此 man1man2 实际上共享相同的原型对象。这意味着当修改 man1clothing 属性时,实际上也影响了 man2clothing 属性,因为它们引用的是同一个原型对象。

因此,当运行这段代码时,第一个警报框将显示 ["trousers", "dress", "jacket", "coat"],而第二个警报框也将显示相同的结果,因为 man2clothing 属性也被修改了。

这种共享原型属性的问题是原型链继承中的一个常见陷阱。为了避免这种问题,通常建议在构造函数中初始化实例特有的属性,而不是将它们放在原型对象中。

如果您希望每个实例都有自己独立的 clothing 属性,您可以在构造函数中初始化它,而不是放在原型对象中。这样就可以避免原型链共享属性的问题。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

分才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值