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而是其他的东西?
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
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
实例的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。
但愿我说清楚了。。。