Function.__proto__ === Function.prototype 引发了我胡乱的哲学思考

前两天我又试图顺着__proto__和prototype寻找JavaScript宇宙的本源,最后还是不出意料的疯了。

我没疯,经过无数次的测试,我偶然发现了这样一个令人奇怪的现象:

在chrome控制台中, Function.__proto__ === Function.prototype返回的是true,这就引发了我的思考。

思考了两三天,又刷了一遍MDN相关部分,有了新的收获。

Function,从小往大说,应该是:构造函数——函数——对象。

1、Function是一个构造函数,通过new调用可以生成函数对象,即我们一般自定义的那种函数。所以Fucntion这个构造函数的prototype是所有函数的__proto__,有call, apply等方法。下图证实了这个说法:

2、Function是一个函数,因为构造函数是一种特殊的函数(可通过new调用)。既然它是一个函数,那么按照上面的说法【Fucntion这个构造函数的prototype是所有函数的__proto__】,就有

Function.__proto__ === Function.prototype。在我之前的理解中,形如 a.__proto__ === b.prototype 的情况成立,几乎只有一种可能,那就是:b为构造函数, a是b的实例。把这个可能代入到这里,就是Function是Function的实例,先有Function才有Function,显然不是这样的。所以,Function并不是通过构造函数Function创建的,JavaScript的宇宙中也没有哪个对象必须通过构造函数创建。而且构造函数这种东西在JS里本来就很别扭,人们总说ES6的class是向Java、C++程序员妥协,我觉得可能大写字母开头的构造函数也是这样的妥协吧。Function这个内置的函数/构造函数有什么用呢?有人用它来创建函数吗?可能它目前唯一的作用就是挂着所有函数对象的prototype。往大了说,所有的构造函数都是为了让那一类实例对象有个地方好找它们的原型,顺便骗骗Java程序员,哈哈。

3、Function是JS的一个内置对象。之前我对MDN左侧目录的【内置对象】四个字颇有微词,因为在我相信中JS内置的无非是Object、Number、Array等构造函数,叫【内置构造函数】不是更好?现在我又想想,一句妙语脱口而出:这世界上根本就没有食神,或者说人人都是食神

原文地址:https://www.cnblogs.com/geekshine/p/9296794.html

时间: 2024-10-09 05:19:46

Function.__proto__ === Function.prototype 引发了我胡乱的哲学思考的相关文章

prototype __proto__ Function

我们创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象.(注意:是函数才有prototype属性) 而__proto__属性每一个对象都有. 在js中如果A对象是由B函数构造的,那么A.__proto__ === B.prototype 所以: (1).__proto__ === Number.prototype//true http://blog.csdn.net/aitangyong/article/details/44837655 结论1:Object.prot

JS的__proto__与prototype

一.prototype和__proto__的概念 prototype是函数的一个属性(每个函数都有一个prototype属性),这个属性是一个指针,指向一个对象.它是显示修改对象的原型的属性. __proto__是一个对象拥有的内置属性(请注意:prototype是函数的内置属性,__proto__是对象的内置属性),是JS内部使用寻找原型链的属性.(函数也是个对象,通过Function创建的对象) 二.new 的过程 var Person = function(){}; var p = new

15条规则解析JavaScript对象布局(__proto__、prototype、constructor)

大家都说JavaScript的属性多,记不过来,各种结构复杂不易了解.确实JS是一门入门快提高难的语言,但是也有其他办法可以辅助记忆.下面就来讨论一下JS的一大难点-对象布局,究竟设计JS这门语言的人当时是怎么做的?设计完之后又变成了什么? 我们来看一张图: 相信大家对这张图都不陌生了,构造函数有一个prototype属性指向其原型.相反原型也有一个constructor指向构造函数.与此同时实例也有一个constructor指向构造函数,这简直就是互相捆绑生怕找不到啊不是吗? 还有一个我们称之

JavaScript中__proto__与prototype的关系

一.所有构造器/函数的__proto__都指向Function.prototype,它是一个空函数(Empty function) 1 2 3 4 5 6 7 8 9 Number.__proto__ === Function.prototype  // true Boolean.__proto__ === Function.prototype // true String.__proto__ === Function.prototype  // true Object.__proto__ ==

JavaScript中__proto__与prototype的关系(转)

一.所有构造器/函数的__proto__都指向Function.prototype,它是一个空函数(Empty function) 1 2 3 4 5 6 7 8 9 Number.__proto__ === Function.prototype  // true Boolean.__proto__ === Function.prototype // true String.__proto__ === Function.prototype  // true Object.__proto__ ==

javascript--15条规则解析JavaScript对象布局(__proto__、prototype、constructor)

大家都说JavaScript的属性多,记不过来,各种结构复杂不易了解.确实JS是一门入门快提高难的语言,但是也有其他办法可以辅助记忆.下面就来讨论一下JS的一大难点-对象布局,究竟设计JS这门语言的人当时是怎么做的?设计完之后又变成了什么? 我们来看一张图:  相信大家对这张图都不陌生了,构造函数有一个prototype属性指向其原型.相反原型也有一个constructor指向构造函数.与此同时实例也有一个constructor指向构造函数,这简直就是互相捆绑生怕找不到啊不是吗? 还有一个我们称

Javascript深入__proto__和prototype的区别和联系

有一个一个装逼的同事,写了一段代码 function a(){} a.__proto__.__proto__.__proto__ 然后问我,下面这个玩意a.__proto__.__proto__.__proto__是啥,然后我一脸懵逼,prototype还知道一点,这个__proto__,还来三个,是个什么鬼.于是我一直不能放下这个问题,虽然我很懒,很不喜欢费脑子,但是这个坎还是过不去,最近两天研究了大半天,就有了这篇文章.我先说出答案, 上面的值为 null.我还很负责的告诉你,下面的_a._

__proto__和prototype

一个对象的__proto__ 属性和自己的内部属性[[Prototype]]指向一个相同的值 (通常称这个值为原型),原型的值可以是一个对象值也可以是null(比如说Object.prototype.__proto__的值就是null).该属性可能会引发一些错误,因为用户可能会不知道该属性的特殊性,而给它赋值,从而改变了这个对象的原型. 如果需要访问一个对象的原型,应该使用方法Object.getPrototypeOf. 当一个对象被创建时,它的 __proto__ 属性和内部属性[[Proto

js中__proto__和prototype的区别和联系

作者:苏墨橘来源:知乎 备注:本篇文章比较清楚的解释了__proto__属性.prototype.instanceof,秉持一贯风格,好文收藏,贴在这里供大家学习. __proto__(隐式原型)与prototype(显式原型) 1.是什么 显式原型 explicit prototype property: 每一个函数在创建之后都会拥有一个名为prototype的属性,这个属性指向函数的原型对象.Note:通过Function.prototype.bind方法构造出来的函数是个例外,它没有pro