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

发布于 2022-09-03 08:35:36 字数 536 浏览 15 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

醉城メ夜风 2022-09-10 08:35:36

两句话足矣:

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

A.prototype.constructor === A

二. 你自己new出来的对象,本身是没有constructor属性的,它的constructor需要到它的原型链去找。

你把这两句话连起来思考一下。

over。

我给你画了两张图,分别是两种情况下的图示:

图片描述

下面的图是你修改了Dog的构造函数之后,造成的结果是“你强行把Dog的实例对象的原型执行了一个新的对象,与Object.prototype直接连接了起来,与Huskies无关了。”

图片描述

煮酒 2022-09-10 08:35:36

参考: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.

小帐篷 2022-09-10 08:35:36

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

假情假意假温柔 2022-09-10 08:35:36

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

旧梦荧光笔 2022-09-10 08:35:36

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文