关于JS的原型链?

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

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

阅读 3.4k
6 个回答

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

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

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

推荐看看这篇文章:最详尽的 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,保证原型链能够正常结束。

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

====

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

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

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

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

图片描述

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题