js中constructor指向问题

本文探讨了JavaScript中构造器函数、原型对象及其constructor属性之间的关系。通过具体示例,展示了如何利用constructor属性来实现继承,并讨论了在修改原型链时constructor属性指向的变化。文章最后强调了正确设置constructor的重要性。

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

首先用一个例子指出来constructor存在形式。

function Fruit(){ }
var f=new Fruit();
console.log(f.constructor);//打印出Fruit()
由上面的代码我们总结出结论1:上面的代码在控制台可以看出constructor是指向构造器Fruit的引用。

function Fruit(){ this.name=“火龙果”}
//var f=new Fruit();
function Apple(){this.name=“苹果”;}
Apple.prototype=new Fruit();
var apple=new Apple();
console.log(apple.constructor);//依然打印出Fruit()
Apple.prototype={};//空对象的构造器是Object()
apple=new Apple();
console.log(apple.constructor);//指向Object()

这个地方就有点奇怪了。这个constructor到底指向的是那个实例的构造器?

根据上面的代码总结出结论2:constructor指向的是原型对象的构造器的引用

即 apple.constructor==Apple.prototype.constructor

var apple2=new apple.constructor();
console.log(apple2.name);
或者

var apple2=new Apple.prototype.constructor();
console.log(apple2.name);
打印的都是火龙果。

我们现在想让他执行的是苹果的打印;这个时候就需要对constructor的指向进行重新指定。

根据上面的两个结论:无论是修改实例的constructor还是构造器的原型constructor属性都是可以达到目的的;

可以在重写了prototype属性的代码后写下这样的代码

Apple.prototype.constructor=Apple;
或者在实例化后对实例的constructor进行重新制定。

apple.constructor=Apple;
虽然上面的两种方式都能达到目的,但是推荐使用第一种。

第二种方式需要有一个实例化的对象,而我们只用在对继承的创建完成后才会去实例化,

等有了实例化对象在去修改constructor,这个时候已经迟了,意义已经不大了,继承的关系已经确定了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值