JavaScript使用prototype继承构造函数会改变的问题
天蓬老师
天蓬老师 2017-04-11 11:54:51
[JavaScript讨论组]

使用原型继承为什么会改变子类的构造函数呢?

看代码:

var A = function (){
    console.log('A');
};

var B = function (){
    console.log('B');
};

var C = function (){
    console.log('C');
};

B.prototype= new A();

var b = new B();
var c = new C();
console.log(b.constructor.toString());   //奇怪啊
console.log(c.constructor.toString());

第一个console输出结果竟然是:

function (){

console.log('A');

}

不是很理解为什么会是这个结果,求大神解答

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(4)
高洛峰

B.prototype= new A();

是赋值操作,所以 A.prototype.contructor 就赋值给了B.prototype
new B();实例化的过程中其实是将B.prototype克隆出来 再让B构造函数处理后返回

因此需要重新指定

B.prototype= new A();
B.prototype.contructor = B;

另外,继承我个人建议用Object.create实现

B.prototype = Object.create(A.prototype);
B.prototype.contructor = B;

//这样继承就不用去实例化一次A
阿神

你把原型链画出来就明白了,constructor属性是在原型里,又不是在b对象中

PHP中文网

好想类似的问题刚有人问过了,js里,实例的constructor.ptototype一定指向实例的构造函数么?

大家讲道理

因为你直接让B.prototype= new A();

这种方式覆盖了原先的B.prototype.contructor属性。

b.constructor实际上是去找b._proto_.constuctor,现在它的值是new A().constructor

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号