javascript constructor 为什么不是该对象的构造函数而是原型链的顶部构造函数?
function Dog(argument) {}
function Huskies(argument) {}
Huskies.prototype = new Dog();
var dog = new Huskies();
代码如上,当我输出:console.log(dog.constructor);
的时候,输出的是Dog
,我又改了一下Dog
:
function Dog(argument) {
this.__proto__ = {};
}
此时console.log(dog.constructor);
输出的是Object
,为什么constructor
不是Huskies
?
好吧,怪我没说清楚,我补充一下,我的问题是为什么constructor
不是Huskies
而是其他的东西?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
两句话足矣:
一. 对于你自己定义的某个函数
A
,有:二. 你自己
new
出来的对象,本身是没有constructor
属性的,它的constructor
需要到它的原型链去找。你把这两句话连起来思考一下。
over。
我给你画了两张图,分别是两种情况下的图示:
下面的图是你修改了Dog的构造函数之后,造成的结果是“你强行把Dog的实例对象的原型执行了一个新的对象,与Object.prototype直接连接了起来,与Huskies无关了。”
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor
Object.prototype.constructor
:1.dog.constructor->Huskies.prototype.constructor->Dog.prototype.constructor,即Dog
2.第二种情况,new Dog得到的对象,原型是指向{}的,所以原型链变成:
dog.constructor->Huskies.prototype.constructor->Object.prototype.constructor,即Object
Huskies.prototype = new Dog(); 这样做的,就会把Huskies的原型链接切断,连接到Dog上面,所以当你 var dog = new Huskies(); 肯定是Dog的原型;之后你有修改了this.__proto__ = {};等于把原来的Dog原型切断,换成了{},这个是一个对象,继而是Object.prototype
https://segmentfault.com/q/10...类似的问题
实例的constructor指向的是对象的prototype.constructor属性,如果prototype中没有constructor,那么会继续寻找prototype的prototype.constructor,一层层往上找,找到万物之源Object对象为止。原型链就是这么工作的。
Huskies.prototype = new Dog()将new Dog()设置为Huskies的原型对象后,没有声明Huskies.prototype.constructor,那么在查询Huskies实例的constructor的时候,在Huskies.prototype中找不到constructor属性,就接着向上找到Huskies.prototype实例的原型对象Dog,而Dog.prototype.constructor没有被改写过,即为Dog,所以第一次得到的结果就是Dog。
function Dog(argument) {this.__proto__ = {};}重写过Dog构造方法后,将Dog.prototype指向了一个空对象。同之前一样,找到Dog.prototype这个空对象之后,空对象是没有constructor属性的,所以就继续向上找到Object.prototyple,所以得到的结果就是Object。
但愿我说清楚了。。。