BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / www-technology / #28487同步于 2014/12/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖

原型链继承的constructor细节问题..

RyanV
2014/12/5镜像同步6 回复
function SuperType (){ } function SubType(){ } SubType.prototype = new SuperType(); 继承之前SubType.prototype.constructor指向SubType 继承之后SubType.prototype.constructor会是SuperType 然后看到这么一句话: 不是SubType.prototype的constructor被重写了,而是SubType.prototype指向了另一个对象_SuperType.prototype,这个对象的constructor指向的是SuperType 问题来了:这句话意味着这个SubType.prototype.constructor的constructor实际上是通过原型链搜索到父类原型的constructor属性从而指向的SuperType对象? 那么子类SubType.prototype自己原来construtor这个属性指向啥。。难道不是重写为跟父类的constructor一样么?还是继承之后SubType.prototype实际上没有了constructor这个属性了..
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
liu907030机器人#1 · 2014/12/6
不是说SubType.prototype.constructor通过原型链搜索到父类的constructor 而是SubType通过 SubType.prototype = new SuperType(); 这个语句,使得它的prototype指向了一个父类的实例new SuperType(),就是Subtype.prototype被重写了,不再是原来的prototype了 而父类的实例的创建都是以父类的prototype对象为模版,从而也具有了父类的prototype对象上的constructor,所以指向的是父类的构造函数SuperType() 就像你写的,在继承前,子类SubType.prototype.constructor指向最初子类的构造函数SubType(),但是继承后,SubType的整个prototype被重写了,并不是具体其中的某个属性 事实上,在很多更严谨的继承惯例中,都还会加上一句 SubType.prototype.constructor = SubType;来将constructor重新指回继承前的构造函数,来应对某些更严谨的场合
RyanV机器人#2 · 2014/12/6
【 在 liu907030 的大作中提到: 】 : 不是说SubType.prototype.constructor通过原型链搜索到父类的constructor : 而是SubType通过 SubType.prototype = new SuperType(); 这个语句,使得它的prototype指向了一个父类的实例new SuperType(),就是Subtype.prototype被重写了,不再是原来的prototype了 : 而父类的实例的创建都是以父类的prototype对象为模版,从而也具有了父类的prototype对象上的constructor,所以指向的是父类的构造函数SuperType() : ................... 大概懂了 最后一句不太理解 我的理解是,实例(SubType.prototype)的construtor属性实际上是存在于构造函数的原型当中(SuperType.prototype); 加上一句 SubType.prototype.constructor = SubType; 那么实际上是SuperType.prototype.constructor被改写了呀,这样不是不对吗, 还是我理解错了,,实例自己本身也有一个construtor。。跟构造函数原型中的constructor不是同一个。。
liu907030机器人#3 · 2014/12/6
【 在 RyanV 的大作中提到: 】 : : 大概懂了 : 最后一句不太理解 我的理解是,实例(SubType.prototype)的construtor属性实际上是存在于构造函数的原型当中(SuperType.prototype); : ................... 你可以看看调试的结果,之所以父类的prototype上的constructor没有随之修改,问题就在于SubType.prototype = new SuperType() 是通过把父类的实例new SuperType()赋值给SubType.prototype,而一个类所声明的实例虽然可以通过原型链访问到这个类的prototype上的声明的属性,但是并不能修改它们,只能通过在这个实例上重写同名的属性来覆盖类的prototype上的同名属性。 这也就是为什么用SubType.prototype = new SuperType()来实现继承而不是直接写 SubType.prototype = SuperType.prototype; 下面这图的情况就是 SubType.prototype = SuperType.prototype;的情形,就会发生你说的情况
liu907030机器人#4 · 2014/12/6
不是SubType.prototype的constructor被重写了,而是SubType.prototype指向了另一个对象_SuperType.prototype,这个对象的constructor指向的是SuperType 书上这句话说的不算错,但是有些误导,这不代表SubType.prototype就是直接引用了SuperType.prototype 事实上一个类所声明的实例都会有一个内部属性__proto__ ,这个属性一般是不建议直接访问的,正是这个属性指向了(更形象应该叫复制了)该类的prototype,从而使得实例能够获得类的prototype上的属性和方法,但是在实例上声明的属性和方法对这个类的prototype是没影响的
RyanV机器人#5 · 2014/12/7
【 在 liu907030 的大作中提到: 】 : : [upload=1][/upload] : 你可以看看调试的结果,之所以父类的prototype上的constructor没有随之修改,问题就在于SubType.prototype = new SuperType() 是通过把父类的实例new SuperType()赋值给SubType.prototype,而一个类所声明的实例虽然可以通过原型链访问到这个类的prototype上的声明的属性,但是并不能修改它们,只能通过在这个实例上重写同名的属性来覆盖类的prototype上的同名属性。 : ................... 这下理解清楚了,好详细,多谢!
LoveEugene机器人#6 · 2014/12/7
赞细致! 我说说我是怎么来看的。 1. Javascript中一切皆json——对象、属性的值,都是一个json对象 2. SubType.prototype = new SuperType(); 这是new操作,创建一块新的内存 3. SuperType.prototype的定义是{functionX:{ }, ...},其中functionX可以在新内存中被修改,包括prototype.constructor。这个修改的范围是在新内存的this.prototype下的,类似: http://ejohn.org/apps/learn/#66 不用特殊对待javascript的prototype和constructor,它们也是一般属性。更关键的是弄清楚this,也就是当前的内存。