首页 > javascript constructor 为什么不是该对象的构造函数而是原型链的顶部构造函数?

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而是其他的东西?


https://.com/q/10...类似的问题


Huskies.prototype = new Dog(); 这样做的,就会把Huskies的原型链接切断,连接到Dog上面,所以当你 var dog = new Huskies(); 肯定是Dog的原型;之后你有修改了this.__proto__ = {};等于把原来的Dog原型切断,换成了{},这个是一个对象,继而是Object.prototype


两句话足矣:

一. 对于你自己定义的某个函数A,有:

A.prototype.constructor === 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

Returns a reference to the Object function that created the instance's prototype.


1.dog.constructor->Huskies.prototype.constructor->Dog.prototype.constructor,即Dog
2.第二种情况,new Dog得到的对象,原型是指向{}的,所以原型链变成:
dog.constructor->Huskies.prototype.constructor->Object.prototype.constructor,即Object


实例的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。
但愿我说清楚了。。。

【热门文章】
【热门文章】