js中的prototype和constructor

本文解析了JavaScript中构造函数与原型的关系,重点介绍了如何正确设置构造函数的prototype属性以避免潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这之前先说明几个问题:

prototype是JavaScript中所有对象都具有的属性,
constructor是用new创建函数的才有的属性。

当使用new来创建一个函数时,JavaScript会自动创建一个prototype属性,并且将prototype.constructor属性指向该函数本身。

见下面的例子(在firebugs下完成):
>>> Object.prototype. constructor === Object
true
>>> function Hero() {this.name = "Hero"}
>>> Hero.prototype.constructor == Hero
true
>>> var h1 = new Hero()
>>> h1.constructor //没有更改prototype的情况下,h1.constructor是正确的
Hero()
>>> Hero.prototype = {} //将Hero.prototype制空
Object
>>> var h2 = new Hero()
>>> h2.constructor  //h2.constructor是错误的
Object()
>>> function Hero2() {this.name = "Hero2"}
>>> Hero.prototype = new Hero2 //将Hero.prototype制为Hero2
Object
>>> var h3 = new Hero()
>>> h3.constructor //h3.constructor是错误的
Hero2()
>>> Hero.prototype.constructor = Hero //将Hero.prototype.constructor设置回去
Hero()
>>> var h4 = new Hero()
>>> h4.constructor //恢复正常
Hero()

 

所以在自己设置函数的prototype时,一定要同时更改函数的constructor属性,要不然会出现一些莫名其妙的问题!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值