关于JS的原型链?

发布于 2022-09-06 02:32:38 字数 296 浏览 24 评论 0

Function.prototype.__proto__ === Object.prototype
//true
Function.prototype.constructor === Object
//false

clipboard.png
如果上面第一行代码是正确的,第二行应该也对啊?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(6

素食主义者 2022-09-13 02:32:38

1. 看到这道题,也让我自己又加深了一些理解,我先说一下楼主想问的是什么

// 我想这句话楼主应该是理解的
console.log(Function.prototype.__proto__ === Object.prototype);  // true

//主要问题是接下来的这句

console.log(Function.prototype.constructor === Object)   // false

因为第一句话成立,所以楼主把Function.prototype理解成了一个Object实例,因为如果Function.prototype是一个Object实例的话,第二句话也就会是true了,证明如下

var b = {};
b.constructor === Object    // true

原因也正在这里,因为Function.prototype并不是Object构造函数通过new出来的实例,Function.prototype的构造函数是Function,说明如下

// 查看Function.prototype的具体数据类型
console.log(Object.prototype.toString.call(Function.prototype))   // Function

所以Function.prototype.constructor为Function。

2.我认为这个问题还是从概念上来理解是最好的

 console.log(Function.prototype.__proto__ === Object.prototype);  // true

因为Function继承Object, 所以Function.prototype其实是应该等于一个Object的实例的,这就是继承实现的方式,而Object的实例有一个内部的[[prototype]]属性,在一些浏览器的实现中可以通过__proto__来访问到,指向Object.prototype,既然让Function.prototype等于一个Object的实例,Object实例的__proto__指向Object.prototype,所有Function.prototype.__proto__指向Object.prototype,用代码解释如下:

Function.prototype = new Object();   // Function继承Object
console.log(Function.prototype.__proto__ === Object.prototype);   // true 

对于Function.prototype.constructor的理解,从概念上很好理解,在Function这个构造函数创建的时候,内部就会初始化一个prototype属性,而同时也包含一个constructor属性,指向构造函数本身

所以

console.log(Function.prototype.constructor === Function)  // true

我的能力也有限,希望能帮到你,如果有问题,也请大家多多指正

回梦 2022-09-13 02:32:38

Function.prototype.constructor === Function
//true

花落人断肠 2022-09-13 02:32:38

推荐看看这篇文章:最详尽的 JS 原型与原型链终极详解,没有「可能是」。(三)

所有的构造器都来自于Function.prototype,甚至包括根构造器ObjectFunction自身。所有构造器都继承了Function.prototype的属性及方法。如length、call、apply、bind

Function.prototype.__proto__ === Object.prototype //true

其实这一点我也有点困惑,不过也可以试着解释一下。
Function.prototype是个函数对象,理论上他的__proto__应该指向 Function.prototype,就是他自>己,自己指向自己,没有意义。
JS一直强调万物皆对象,函数对象也是对象,给他认个祖宗,指向Object.prototypeObject.prototype.__proto__ === null,保证原型链能够正常结束。

勿忘心安 2022-09-13 02:32:38

你是怎么理解原型链的?第二行为什么返回true?

====

对象的 prototype 是一个普通对象,所以

Function.prototype.__proto__ === Object.prototype
// true
Function.__proto__ 
// 这个指向 Function.prototype

对象的 constructor 属性指向其构造器

Function.prototype.constructor === Function
// true
菊凝晚露 2022-09-13 02:32:38

图片描述

看这个图,提醒一下:prototype是函数才有的属性,__proto__是浏览器实现的 所有对象都有一个[[prototype]]的私有属性 的这个[[prototype]]

黎歌 2022-09-13 02:32:38

构造器和原型不要搞混了
clipboard.png

1.对象有属性__proto__,指向该对象的构造函数的原型对象。
2.方法除了有属性__proto__,还有属性prototype,prototype指向该方法的原型对象。

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