


Xiaobai parle de la compréhension des compétences chain_javascript du prototype JS
La chaîne prototype est un peu déroutante à comprendre, et il y a beaucoup d'informations sur Internet. Chaque fois que je n'arrive pas à dormir la nuit, j'aime toujours trouver des articles sur les chaînes prototypes et les fermetures sur Internet, et l'effet est excellent.
Ne vous attardez pas sur ce tas de terminologie, cela ne vous fera vraiment rien à part vous déformer l'esprit. Examinons la chaîne de prototypes simplement et grossièrement et réfléchissons à des choses qui n'ont rien à voir avec le code, comme les humains, les monstres et les transexuelles.
1) Les humains naissent d'êtres humains, les monstres naissent de monstres. Les humains et les démons sont tous deux des instances d'objets, et les humains et les démons sont des prototypes. Les prototypes sont également des objets, appelés objets prototypes.
2) Avoir des relations sexuelles avec une mère humaine et un père humain peut donner naissance à un groupe de bébés humains, et avoir des relations sexuelles avec une mère démon et un père démon peut donner naissance à un groupe de bébés démons. constructeur, communément appelé créateur d’humains.
3) Renfu enregistrera les informations sur le sexe, afin que vous puissiez trouver les informations sur le sexe via Renfu, ce qui signifie que vous pouvez trouver le constructeur via l'objet prototype.
4) Les humains peuvent donner naissance à plusieurs bébés, mais ces bébés n'ont qu'une seule mère. C'est la particularité du prototype.
5) Les êtres humains naissent aussi d'êtres humains. A travers les êtres humains, nous pouvons trouver d'autres êtres humains, et ensuite à travers les êtres humains, nous pouvons trouver d'autres êtres humains. Cette relation s'appelle une chaîne prototype.
6) La chaîne de prototypes n'est pas infinie. Lorsque vous continuez à chercher parmi les gens, vous découvrirez finalement qu'aucune des personnes... n'est des personnes, et c'est là que la chaîne de prototypes pointe finalement vers zéro.
7) Les gens nés d'êtres humains ressembleront à des humains, et les monstres nés de monstres seront laids comme des monstres. C'est ce qu'on appelle l'héritage.
8) Vous avez hérité de la couleur de peau de votre mère, votre mère a hérité de la couleur de peau de votre mère, de la couleur de peau de votre mère, de celle de votre mère..., c'est l'héritage de la chaîne prototype.
9) Si vous n'avez pas de maison, alors votre maison fait référence à la maison de votre mère ; si votre mère n'a pas de maison, alors votre maison fait référence à la maison de votre mère… C'est la recherche ascendante du prototype. chaîne.
10) Vous hériterez du look de votre mère, mais vous pourrez également teindre vos cheveux, les laver, les couper et les souffler, ce qui signifie que les propriétés de l'objet pourront être personnalisées et remplaceront les propriétés héritées.
11) Bien que vos cheveux aient été teints en jaune après avoir été lavés, coupés et soufflés, vous ne pouvez pas changer l'apparence de votre mère. Les jeunes frères et sœurs nés de votre mère n'ont rien à voir avec vos cheveux jaunes, ce qui signifie que. l'instance d'objet ne peut pas être modifiée.
12) Mais si votre maison est incendiée parce que vous jouez avec le feu, cela signifie que votre maison, la maison de votre mère et les maisons de vos frères ont toutes été incendiées. C'est le partage des attributs prototypes.
13) Le surnom de votre mère est A-Zhen, et les tantes d'à côté vous appellent A-Zhen'er, mais les cheveux de votre mère sont passés de Rejoice à une Reine Lion Golden Retriever, et les tantes d'à côté ont changé de coiffure. nom pour vous appeler Golden Retriever Lion Prince. C'est ce qu'on appelle le prototype du sexe dynamique.
14) Ta mère aime la beauté, alors elle est allée en Corée pour subir une chirurgie plastique, de sorte que ta mère ne peut même pas la reconnaître. Même si les cheveux de ta mère sont redevenus joyeux, le voisin d'à côté t'appelle toujours le. Prince Golden Retriever. Parce que personne n'a reconnu votre mère, votre mère a été refaite après une chirurgie plastique. Il s'agit d'une réécriture complète du prototype.
Non ! Vous en avez assez ! Ne faites pas BB ! Montre-moi le code !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
|
Pouvez-vous en gros le comprendre après l’avoir lu ?
Parlons maintenant de la différence entre p1.age = 20, p1.home = ['Hangzhou', 'Guangzhou'] et p1.home[0] = 'Shenzhen'. p1.home[0] = 'Shenzhen'; Pour résumer, c'est sous la forme de p1.object.method, p1.object.property.
p1.age = 20; p1.home = ['Hangzhou', 'Guangzhou']; Ces deux phrases sont relativement faciles à comprendre. Oubliez d'abord le prototype, réfléchissez à la façon dont nous ajoutons des attributs à un objet ordinaire :
1 2 3 |
|
Est-ce que cela a du sens ? Même chose.
Alors pourquoi p1.home[0] = 'Shenzhen' ne crée-t-il pas un attribut de tableau domestique sous p1, puis définit sa première position sur 'Shenzhen' ? Oublions cela d'abord. Pensez à l'objet obj ci-dessus S'il est écrit comme ceci : var obj.name = 'xxx', obj.num = [100, 200], pouvez-vous obtenir le résultat souhaité ? Évidemment, vous n'obtenez rien d'autre qu'une erreur. Parce que obj n'a pas encore été défini, comment pouvons-nous y ajouter des éléments ? De la même manière, home dans p1.home[0] n'est pas défini sous p1, donc home[0] ne peut pas être défini directement en une seule étape. Si vous souhaitez créer un tableau domestique sous p1, bien sûr, vous l'écrirez comme ceci :
1 2 |
|
这不就是我们最常用的办法吗?
而之所以 p1.home[0] = 'Shenzhen' 不直接报错,是因为在原型链中有一个搜索机制。当我们输入 p1.object 的时候,原型链的搜索机制是先在实例中搜索相应的值,找不到就在原型中找,还找不到就再往上一级原型中搜索……一直到了原型链的终点,就是到null还没找到的话,就返回一个 undefined。当我们输入 p1.home[0] 的时候,也是同样的搜索机制,先搜索 p1 看有没有名为 home 的属性和方法,然后逐级向上查找。最后我们在Mother的原型里面找到了,所以修改他就相当于修改了 Mother 的原型啊。
一句话概括:p1.home[0] = 'Shenzhen' 等同于 Mother.prototype.home[0] = 'Shenzhen'。
由上面的分析可以知道,原型链继承的主要问题在于属性的共享,很多时候我们只想共享方法而并不想要共享属性,理想中每个实例应该有独立的属性。因此,原型继承就有了下面的两种改良方式:
1)组合继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
结果是酱紫的:
这里第一次执行的时候,得到 Person.prototype.age = undefined, Person.prototype.hobby = ['running','football'],第二次执行也就是 var p1 = new Person('Jack', 20) 的时候,得到 p1.age =20, p1.hobby = ['running','football'],push后就变成了 p1.hobby = ['running','football', 'basketball']。其实分辨好 this 的变化,理解起来也是比较简单的,把 this 简单替换一下就能得到这个结果了。 如果感觉理解起来比较绕的话,试着把脑子里面的概念扔掉吧,把自己当浏览器从上到下执行一遍代码,结果是不是就出来了呢?
通过第二次执行原型的构造函数 Mother(),我们在对象实例中复制了一份原型的属性,这样就做到了与原型属性的分离独立。细心的你会发现,我们第一次调用 Mother(),好像什么用都没有呢,能不调用他吗?可以,就有了下面的寄生组合式继承。
2)寄生组合式继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
结果是酱紫的:
原型中不再有 age 和 hobby 属性了,只有两个方法,正是我们想要的结果!
关键点在于 object(o) 里面,这里借用了一个临时对象来巧妙避免了调用new Mother(),然后将原型为 o 的新对象实例返回,从而完成了原型链的设置。很绕,对吧,那是因为我们不能直接设置 Person.prototype = Mother.prototype 啊。
小结
-------------------------------------------------------------------------------
说了这么多,其实核心只有一个:属性共享和独立的控制,当你的对象实例需要独立的属性,所有做法的本质都是在对象实例里面创建属性。若不考虑太多,你大可以在Person里面直接定义你所需要独立的属性来覆盖掉原型的属性。总之,使用原型继承的时候,要对于原型中的属性要特别注意,因为他们都是牵一发而动全身的存在。
下面简单罗列下js中创建对象的各种方法,现在最常用的方法是组合模式,熟悉的同学可以跳过到文章末尾点赞了。
1)原始模式
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
显然,当我们要创建批量的person1、person2……时,每次都要敲很多代码,资深copypaster都吃不消!然后就有了批量生产的工厂模式。
2)工厂模式
1 2 3 4 5 6 7 8 9 10 |
|
工厂模式就是批量化生产,简单调用就可以进入造人模式(啪啪啪……)。指定姓名年龄就可以造一堆小宝宝啦,解放双手。但是由于是工厂暗箱操作的,所以你不能识别这个对象到底是什么类型、是人还是狗傻傻分不清(instanceof 测试为 Object),另外每次造人时都要创建一个独立的temp对象,代码臃肿,雅蠛蝶啊。
3)构造函数
1 2 3 4 5 6 7 8 9 10 |
|
构造函数与C++、JAVA中类的构造函数类似,易于理解,另外Person可以作为类型识别(instanceof 测试为 Person 、Object)。但是所有实例依然是独立的,不同实例的方法其实是不同的函数。这里把函数两个字忘了吧,把sayName当做一个对象就好理解了,就是说张三的 sayName 和李四的 sayName是不同的存在,但显然我们期望的是共用一个 sayName 以节省内存。
4)原型模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
这里需要注意的是原型属性和方法的共享,即所有实例中都只是引用原型中的属性方法,任何一个地方产生的改动会引起其他实例的变化。
5)混合模式(构造+原型)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
做法是将需要独立的属性方法放入构造函数中,而可以共享的部分则放入原型中,这样做可以最大限度节省内存而又保留对象实例的独立性。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Des questions et des solutions fréquemment posées pour l'impression de billets thermiques frontaux pour le développement frontal, l'impression de billets est une exigence commune. Cependant, de nombreux développeurs mettent en œuvre ...

JavaScript est la pierre angulaire du développement Web moderne, et ses principales fonctions incluent la programmation axée sur les événements, la génération de contenu dynamique et la programmation asynchrone. 1) La programmation axée sur les événements permet aux pages Web de changer dynamiquement en fonction des opérations utilisateur. 2) La génération de contenu dynamique permet d'ajuster le contenu de la page en fonction des conditions. 3) La programmation asynchrone garantit que l'interface utilisateur n'est pas bloquée. JavaScript est largement utilisé dans l'interaction Web, les applications à une page et le développement côté serveur, améliorant considérablement la flexibilité de l'expérience utilisateur et du développement multiplateforme.

Il n'y a pas de salaire absolu pour les développeurs Python et JavaScript, selon les compétences et les besoins de l'industrie. 1. Python peut être davantage payé en science des données et en apprentissage automatique. 2. JavaScript a une grande demande dans le développement frontal et complet, et son salaire est également considérable. 3. Les facteurs d'influence comprennent l'expérience, la localisation géographique, la taille de l'entreprise et les compétences spécifiques.

Comment fusionner les éléments du tableau avec le même ID dans un seul objet en JavaScript? Lors du traitement des données, nous rencontrons souvent la nécessité d'avoir le même ID ...

Apprendre JavaScript n'est pas difficile, mais c'est difficile. 1) Comprendre les concepts de base tels que les variables, les types de données, les fonctions, etc. 2) Master la programmation asynchrone et les implémenter via des boucles d'événements. 3) Utilisez les opérations DOM et promettez de gérer les demandes asynchrones. 4) Évitez les erreurs courantes et utilisez des techniques de débogage. 5) Optimiser les performances et suivre les meilleures pratiques.

La discussion sur la réalisation des effets de défilement de parallaxe et d'animation des éléments dans cet article explorera comment réaliser le site officiel de Shiseido (https://www.shiseido.co.jp/sb/wonderland/) ...

Discussion approfondie des causes profondes de la différence de sortie Console.log. Cet article analysera les différences dans les résultats de sortie de la fonction Console.log dans un morceau de code et expliquera les raisons derrière. � ...

Explorez la mise en œuvre de la fonction de glisser et de réglage du panneau de type VScode dans le frontal. Dans le développement frontal, comment implémenter un VScode comme ...
