Maison  >  Article  >  interface Web  >  Une introduction détaillée à la naissance de tout dans le monde JavaScript

Une introduction détaillée à la naissance de tout dans le monde JavaScript

黄舟
黄舟original
2017-03-03 15:10:081122parcourir

1. Créer quelque chose à partir de rien

Au début, il n'y avait rien.

Le Créateur a dit : Rien n'est en soi une chose, donc il y a nul :

Maintenant, nous devons créer quelque chose. Mais que faire s’il n’y a pas de matières premières ?

Une voix dit : N'y a-t-il pas nul ?

Une autre voix a dit : Mais null ne veut rien dire.

Le Créateur a dit : Alors faites quelque chose à partir de rien !

Donc :

L'objet n°1 en JavaScript est généré Autant l'appeler n°1.

Cet objet n°1 est incroyable, il est le véritable ancêtre de toutes choses. Il possède des propriétés que possèdent tous les objets.

Qu'est-ce que __proto__ ? Cela signifie « naissance » ou héritage.

2. La machine à fabriquer des objets

Puisque vous avez déjà un objet, le reste est facile à manipuler, car une chose fait deux, deux fait trois et trois c'est tout.

Mais le Créateur est très paresseux, il ne veut pas créer les objets un par un de ses propres mains. Il a donc construit une machine capable de fabriquer des objets :

Il a donné un nom à la machine : Objet.

Cette machine ne peut pas créer d'objets à partir de rien. Elle a besoin d'un objet modèle pour créer des objets selon cet objet modèle. Naturellement, il utilise le seul objet n°1 comme modèle. Le prototype sur la photo représente l'objet modèle de la machine.

Comment démarrer la machine ? Grâce à la nouvelle commande. Vous criez « nouveau ! » à la machine, et l'objet est créé.

L'émergence des machines a permis la production automatisée d'objets par lots, libérant ainsi les mains du Créateur. Ensuite, le Créateur est parti faire autre chose.

Ce serait trop stupide si la machine se contentait de copier exactement le même objet mécaniquement selon le modèle.

En héritant des traits de leurs parents, la progéniture humaine peut développer des traits que leurs parents n'ont pas. De même, lorsqu'une machine fabrique un objet, en plus d'hériter des propriétés de l'objet modèle, elle peut également ajouter de nouvelles propriétés. Cela rend le monde JavaScript de plus en plus diversifié.

Par exemple, un jour, la machine Objet crée un objet. Il a un attribut spécial appelé drapeau, et la valeur de l'attribut est 10. La représentation graphique est la suivante :

Écrit en code :

var obj = new Object({ flag: 10 });

Le mouvement vigoureux de création a commencé...

Trois. Encore des machines pour fabriquer des objets

Au fil des jours, le Créateur est venu inspecter l'ouvrage. Il était très heureux de voir qu'Object avait créé de nombreux objets.

Par la même occasion, il découvre également que selon le principe des « qui se ressemblent s'assemblent », ces objets peuvent être répartis en de nombreuses catégories. L'intelligent créateur s'est demandé : pourquoi ne pas construire quelques machines supplémentaires et laisser chaque machine être responsable de la fabrication d'un certain type d'objet ? Il a donc construit plusieurs machines et leur a donné des noms. Ce sont :

String : utilisé pour créer des objets représentant un morceau de texte.
Numéro : utilisé pour créer un objet représentant un nombre.
Booléen : utilisé pour créer des objets qui représentent oui et non.
Array : utilisé pour créer des objets de file d'attente ordonnés.
Date : utilisé pour créer un objet représentant une date.
Erreur : utilisé pour créer un objet représentant une erreur.
...

De nombreuses machines démarrent en même temps, chacune accomplissant ses propres tâches, et le mouvement de création est entré dans une nouvelle étape...

Le créateur a commencé à détrompez-vous : bien que la machine soit utilisée pour fabriquer un objet, la machine elle-même est en fait un objet spécial. Maintenant qu’il existe autant de machines, je dois résumer leurs caractéristiques communes et les intégrer dans le système objet.

Ainsi, sur la base de l'objet n°1, le Créateur a créé un objet n°2 et l'a utilisé pour représenter les caractéristiques communes de toutes les machines. En d’autres termes, utilisez-le comme objet prototype pour toutes les machines.

(Remarque : __proto__ est trop compliqué à écrire, nous utiliserons [p] à la place plus tard)

Bien sûr, comme Object, ces machines Elles aussi doivent chacun avoir un objet modèle, c'est-à-dire l'objet pointé par leur attribut prototype. Évidemment, leurs objets modèles doivent hériter de l'objet n°1, c'est-à-dire

这张图显示了JavaScript世界中那些最基本的机器本身的原型链,以及它们的模板对象的原型链。不过看起来太复杂了,所以后面我们就不再把它们完整地画出来了。

四. 制造机器的机器

造物主高兴地想:这下可好了,我造出了Object机器,实现了对象制造的自动化。然后又造出了String、Number等机器,实现了特定类别的对象制造的自动化。但是,为啥总感觉似乎还缺点什么呢?

对啦,还缺少一台制造机器的机器啊!

很快,万能的造物主就把它造了出来,并把它命名为Function。有了Function机器后,就可以实现自动化地制造机器了。
让我们来观察一下Function:

首先,Function是一台机器,所以它的原型对象也是No. 2对象。
其次,Function又是一台制造机器的机器,所以它的模板对象也是No. 2对象。
所以我们得到了Function的一个非常特别的性质:

Function.__proto__ === Function.prototype

哇,太奇妙了!

不要奇怪,这个性质不过是”Function是一台制造机器的机器“这个事实的必然结果。

从这张图中,我们发现:所有的函数(包括Function)的原型都是No. 2对象,而同时Function.prototype也是No. 2对象。这说明了:

从逻辑上,我们可以认为所有机器(包括Function自己)都是由Function制造出来的。

同时,如果再仔细瞧瞧,你会发现:

Object作为一个机器可以看做是有由Function制造出来的,而Function作为一个对象可以看做是由Object制造出来的。

这就是JavaScript世界的“鸡生蛋,蛋生鸡”问题。那么到底是谁生了谁呢?Whatever!

五. 让世界动起来

就像前面所说,机器用来制造某一类对象。正因如此,机器可以作为这类对象的标志,即面向对象语言中类(class)的概念。所以机器又被称为构造函数。在ES6引入class关键字之前,我们常常把构造函数叫做类。

然而,除了作为构造函数来制造对象外,函数通常还有另一个功能:做一件事情。正是有了这个功能,JavaScript的世界才由静变动,变得生机勃勃。

比如说,我们现在用Function机器制造了鸟类(即用来造鸟的机器):

function Bird(color) {
    this.color = color;
}

然后,对着造鸟机说:“new!”,于是造鸟机发动起来,制造一个红色的鸟:

var redBird = new Bird('#FF0000');

如果现在我们想让鸟飞起来,该怎么办呢?我们需要再次用Function制造出一台机器,不过这台机器不是用来制造对象的,而是用来做事儿的,即“让鸟飞起来”这件事情:

// 这是一台通过晃动鸟的翅膀,让鸟飞起来的简陋的机器。
function makeBirdFly(bird) {
    shakeBirdWing(bird);
}

我们知道,让一台制造对象的机器发动,只需要对它喊“new”即可;那么怎样让一台做事情的机器发动呢?更简单,对它咳嗽一声就行了。咳咳咳,

makeBirdFly(redBird);

于是红鸟飞了起来,世界充满了生机。

从上面的Bird和makeBirdFly的定义可以看出:实际上,制造对象的机器和做事情的机器没什么明显区别,不同的只是它们的使用方式。在两种情况下,它们分别被叫做构造函数和普通函数。

说明1:function xxx语法可以看成new Function的等价形式。
说明2:用户自定义的函数通常既可以作为普通函数使用,又可以作为构造函数来制造对象。ES6新增的class语法定义的函数只能作为构造函数,ES6新增的=>语法定义的箭头函数只能作为普通函数。

六. 让世界立体起来

造物主对目前的世界还是不太满意,因为几乎所有的机器的模板对象都是No. 2,这使得JavaScript世界看起来有点扁。

于是造物主再次研究世界万物的分类问题。他发现有些对象会动、还会吃东西,于是把它们叫做动物,然后造了一台Animal机器来制造它们。他进一步发现,即使都是动物,也还是可以进一步分类,比如有些会飞、有些会游,他分别把它们叫做鸟类、鱼类。于是他想,我何不单独造几台机器,专门用来制造某一类动物呢。于是它造出了Bird、Fish等机器。

接下来,在选择这些机器的模板对象时碰到一个问题:如果还像之前那样直接复制一个No. 1对象作为Bird、Fish的模板,那么结果就是这样的:

这样可不好。首先没体现出鸟类、鱼类跟动物的关系,其次它们的模板对象存了重复的东西,这可是一种浪费啊。怎么办呢?简单,让Bird和Fish的模板对象继承自Animal的模板对象就好了。就是说

Bird.prototype.__proto__ === Animal.prototype
Fish.prototype.__proto__ === Animal.prototype

于是:

用同样的方法,造物主造出了一个立体得多的JavaScript世界。

然而这样还不够。虽然那些纯对象现在充满了层次感,但是那些机器对象之间的关系还是扁平的:

那又该怎么办呢?其实用类似的办法就行了:

为了更方便地做到这一点,造物主发明了class关键字。

七. 世界最终的样子

经过一番折腾,JavaScript世界发生了大变化。变得丰富多彩,同时变得很复杂。用一张图再也没法画出它的全貌,只能画出冰山一角:

JavaScript的世界还在不断进化中……

 以上就是JavaScript世界万物诞生记的详细介绍的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn