一篇文章弄懂Javascript

作者: 天渡云 | 来源:发表于2019-02-21 16:49 被阅读4次

在一片混沌中,一个叫Function的函数开天辟地,自己创建了自己。于是,一个叫JavaScript的星球诞生了。


创建了自己的Function

新诞生的星球灰常牛逼,自带了两个规则:

  1. 所有的function都由Function创建,并拥有原型对象。
  2. 所有的对象都由function(construction)创建,并拥有雏形对象。该雏形对象指向function的原型对象。

这时候的Javescript星球只有Function, 所以Function开始按照规则完善自己。

首先只看规则1

Function自己本身就是JavaScript星球上的function,它应由Function创建——它创建的自己没毛病——正好符合规则1。但是目前它还没有自己的原型对象。于是它又创建了自己的原型对象。


Function.prototype

这时候的Javescript星球只有Function和Function.prototype两个对象。他们各自按照规则完善自己。
问题出现了!!
Function.prototype是个对象没问题,但它同时又是Function创建的,所以它是个function,按规则1,它也应该有自己的原型对象。如果再由Function创建一个函数原型对象,那这个原型对象又需要原型对象,这会出现一个死循环,怎么办?
解决办法很简单
JavaScript星球的第2规则妥协了:

JavaScript星球决定1:可以存在没有原型对象的function。这些function不能作为constructor创建对象,但也不是绝对。(下面这段话可以认为是幻觉)
Function.prototype和箭头函数没有原型对象,而且也不能作为constructor,由object.prototype.bind生成的函数没有原型对象,但可以作为constructor。所生成对象的雏形对象指向bind原函数的原型对象。

于是,Function.prototype虽然是个function,但它是个类外,没有原型对象。问题就这么凑合解决了,但不能一直这样,于是Function创建了Object。Object是个函数,它也需要一个原型对象,好在Object创建了自己的原型对象Object.prototype。
到此规则1 完善了。

然后实现规则2

先看看这时候的Javescript星球,现在有Function和Function.prototype两个对象,有Object和Object.prototype两个对象,一共是4个对象。按照规则2,他们都需要一个雏形对象。(它们是由函数创建的,在上面的创建过程可以看出来,没毛病)
先看Function, 它的雏形对象指向创建者的原型对象。它是由自己创建的,并且前面它已经创建了自己的原型对象。于是,它的雏形对象就按规则指向自己的原型对象。

Function.__proto__ === Function.prototype

再看Object,好在它的创建者Function有自己的原型对象,于是

Object.__proto__ === Function.prototype

再看Object. Prototype,这个有点特殊,自己的创建者Object的原型对象,也就是自己,这样就形成一个环了。于是JavaScript星球出了决定2:

Object.prototype----pro === null

剩下Function.prototype。按规则它的雏形对象应该指向创建者的原型对象,现实是,它就是自己创建者的原型对象,于是,按规则就是这个:
Function.prototype.__proto__ === Funtion.prototype
这不是又个圈吗?于是,星球出了决定3

Function.protype.__proto__ === Object.prototype

至此,规则全部完成,最难的原型链基础形成了。现在的JavaScript星球是这样的:


基础JavaScript星球

以后的普通对象创建的过程大致如此:
先定义Constructor,该Constructor由Function创建,
同时Constructor的原型对象由Object创建,
然后通过new Constructor 来创建对象。
对象的雏形对象指向Constructor的原型对象。

function Simple () {}

var simple = new Simple;

simple.__proto__ === Simple.prototype;
对象的定义

JavaScript星球是怎样运行的呢?
在运行开始,它先定义全局作用域,它里边包含一个全局对象,全局对象有一个属性undefined,它是undefined类型的唯一值。
等我慢慢写完。

相关文章

网友评论

    本文标题:一篇文章弄懂Javascript

    本文链接:https://www.haomeiwen.com/subject/pvoryqtx.html