JavaScript中继承时constructor指向的问题

正在学习《JavaScript高级程序设计》,对书中p163-p164的例子有点疑问。
例子如下:

javascriptfunction SuperType(){
    this.property = true;
}
SuperType.prototype.getSuperValue = function(){
    return this.property;
};

function SubType(){
    this.subproperty = false;
}

//继承了SuperType
SubType.prototype = new SuperType();
var instance = new SubType;
//后面不相关的blahblah省略

书中提到了:

要注意instance.constructor现在指向的是SuperType,这是因为原来SubType.prototype中的constructor被重写了的缘故。

对此书中的注释是:

实际上,不是SubType的原型的constructor属性被重写了,而是SubType的原型指向了另一个对象——SuperType的原型,而这个原型对象的constructor属性指向的是SuperType。

对此我不是很能理解,为什么SubType的原型是SuperType的实例,它的constructor就要指向SuperType呢?
如果这么说,所有函数的默认原型都是Object的实例,像SuperType的constructor不就得指向Object?

求大神指点迷津(抱拳)

阅读 6k
6 个回答

因为constructor属性是可以读写的。

SubType.prototype = new SuperType();

上面这句就是new SuperTypeSubTypeconstructor值就被重写了。

如果这么说,所有函数的默认原型都是Object的实例,像SuperType的constructor不就得指向Object?

SubType.prototype = new SuperType();这里用了new所以constructor就指向了SuperType

新手上路,请多包涵

楼主问题:

     为什么SubType的原型是SuperType的实例

答:
SubType.prototype=new SubperType();//使用new操作符调用SubperType函数构造一个名为"SubType.protoType"的实例,这个实例中有一个属性[[prototype]]指向函数原型SuperType.prototype

所以SubType的原型是SuperType的实例

楼主问题:

     它的constructor就要指向SuperType呢

答:

原型链 SubType.prototype→SuperType.prototype

按上述原型链查找在SuperType.property中找到此属性 // SubType.protype已经被重写 并且实例化 所以不存在consturctor属性

SubType的prototype属性也是一个对象

SubType.prototype = new SuperType();

SubType.prototype有了新的指向,一个以SuperType为原型的对象
SubType.prototype.constructor为SuperType对象的构造函数也就是SuperType

所有函数的原型为 Function, Function的原型为 Object

新手上路,请多包涵

.constructor属性在哪 会去找
由于instance = new Sub()
所以instance.__proto__ ----> Sub.prototyoe (constructor ----> Sub构造函数)
但是由于SubType.prototype = new SuperType()
Sub.prototype._proto_ -----> super.prototype (constructor ----> Super构造函数)
所以instance.__proto__.__proto__.constructor--------> Super构造函数

新手上路,请多包涵
实际上,不是SubType的原型的constructor属性被重写了,而是SubType的原型指向了另一个对象——SuperType的原型,而这个原型对象的constructor属性指向的是SuperType。

对于这句话的最后半句> 这个原型对象的constructor属性指向的是SuperType。
,我的理解是这个原型对象是指SuperType的原型对象的constructor指向的是SuperType,而不是SubType的原型对象,因为此时SubType.prototype已经没有constructor属性。

SubType.prototype = new SuperType();
这句代码执行完之后在chrome console里看一下此时SubType.prototype是什么

clipboard.png

可以看到这个时候SubType.prototype已经不存在constructor属性
接下来就会在原型链上找,找到了SuperType.prototype,而SuperType.prototype.constructor就是SuperType

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题