为什么继承的时候动态原型无效

本文探讨了JavaScript中构造函数和原型链的工作原理。通过具体示例解释了如何使用构造函数来创建对象,并讨论了在对象创建过程中原型链的初始化问题。特别是针对构造函数在实例化对象时对原型属性更改的影响进行了深入分析。

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

function polygon(isides) { this.sides = isides; if(typeof polygon._initialized == "undefined") { polygon.prototype.getarea = function() { return 0; }; polygon._initialized = true; } } function triangle(ibase,iheight) { polygon.call(this,3); this.base = ibase; this.hei = iheight; if(typeof triangle._initialized == "undefined") { [color=red]triangle.prototype = new polygon(); [/color]triangle.prototype.getarea = function() { return this.base * this.hei * 0.5; }; triangle._initialized = true; } } [color=red]var otriangle1 = new triangle(12,4);[/color] 


nicholas解释说在代码运行前,对象已被实例,并与prototype联系,在当前对prototype对象替换不会对它产生任何影响,即当前的替换是访问不到的,只有未来对象的实例才会反映出这种改变。于是第一个实例对象就会不正确。但第二个及以后的子类实例都没问题。

也许是翻译的原因,我觉得解释过于简短,容易让人迷惑。我就思考了一下,现在我谈谈我的理解,不一定正确,欢迎拍砖、

我们知道,js里,函数是第一型,也就是说一个函数就是一个对象。

因此,function triangle(ibase,iheight)这个申明,其实就产生了一个对象,只是这个对象虽然叫triangle,但是因为他的函数体还没有被执行过,所以他的prototype其实是object。

当执行var otriangle1 = new triangle(12,4);时,我们又有了一个otriangle1对象,但是因为构建对象的时候,函数体还是没有执行,所以otriangle1的prototype仍然是object。

接着,我们开始执行函数体,函数体里triangle的prototype被赋值为new polygon();所以triangle的prototype成功修改,但是因为otriangle1的prototype是object,而不是triangle,这个修改就变得与他毫无关系,所以otriangle1没有被“正确”初始化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值