关于Javascript的构造函数
function Animal(name){
this.name = name;
}
function Dog(sex){
this.sex=sex;
}
Dog.prototype = new Animal();
//Dog.prototype.constructor = Dog;
var xiaohuang = new Dog("male");
通过Dog.prototype指向Animal 实例以后,达到了继承的目的。但是目前new Dog的实例的构造函数都是指向的Animal。
但是new Dog时,this.sex还是执行了。也就是真正的还是用Dog函数执行的构造。只是记录的构造函数是Animal。
这个机制是不是有点变态?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
短短一段话几乎每一句都是槽点,如果你的知识是从某本书学来的,赶紧扔了它吧。
不,
Dog.prototype
指向的不是Animal
而是Animal
的实例对象,因为你用的是new Animal()
。不,很显然不是这样的,你自己都在倒数第二行的注释里写出了真相,又是如何得出以上结论的呢?
嗯,你在评论里的回复我看到了,你说的是对的,我上面的回答并没有仔细审题,非常抱歉。下面我阐述一下这个问题
首先,
new Animal()
产生的实例对象,其constructor
是Animal
,这个很确定。其次,
Dog
的原型对象被你指向了new Animal()
因此,
new Dog()
实例对象的__proto__
就成了new Animal()
,当我们向其询问constructor
时,答案是Animal
,没有问题。当然要执行了!当你
new Dog()
的时候,调用的就是Dog
构造函数,不执行this.sex
赋值又应该执行什么呢?所以这个机制完全没有什么“变态”一说,是你的理解根本就跑偏了,完全没在点子上。
很正常啊, 实例化一个子类,子类的构造函数当然会调用。