recherche
Maisoninterface Webjs tutorielVous emmène expliquer en détail la chaîne de prototypes JS

Le contenu de cet article vise à expliquer en détail la chaîne de prototypes JS. Elle a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Ma compréhension des prototypes js et des chaînes de prototypes a toujours été déroutante. Après avoir lu "JavaScript Advanced Programming" et divers articles, j'ai enfin une compréhension préliminaire des prototypes et des chaînes de prototypes. compréhension approfondie, j'analyserai une question que j'ai rencontrée il y a quelque temps et j'utiliserai mes propres idées pour l'interpréter afin d'approfondir ma compréhension des prototypes et des chaînes de prototypes.

1. Question

Quel est le résultat de l'exécution du programme suivant ?

function Animal() {
    this.name = 'Animal';
}

Animal.prototype.changeName = function (name) {
    this.name = name;
}

function Cat() {
    this.name = 'Cat';
}

var animal = new Animal();

Cat.prototype = animal;
Cat.prototype.constructor = Cat;

var cat = new Cat();

animal.changeName('Tiger');

console.log(cat.name)

A. Animal
B. Chat
C. Tigre
D.

2. Interprétation

1. Objet prototype

Chaque fois qu'une nouvelle fonction est créée, un prototype sera créé pour la fonction selon un ensemble de règles spécifiques. cette propriété pointe vers l'objet prototype de la fonction. Par défaut, tous les objets prototypes obtiennent automatiquement un attribut constructeur, qui est un pointeur vers la fonction où se trouve l'attribut prototype. Ce qui suit utilise des images pour illustrer


function Animal() {
    this.name = 'Animal';
}
Animal.prototype.changeName = function (name) {
    this.name = name;
}

Créez d'abord une fonction Animal, Animal contient un attribut prototype, pointant vers Animal Prototype et Animal. prototype.constructor pointe vers Animal. À l'heure actuelle, étant donné que l'attribut name est défini dans la fonction, il ne figure pas dans le prototype animal et la fonction changeName est définie via Animal.prototype.changeName, nous pouvons donc utiliser cette méthode pour partager le prototype lors de l'instanciation de plusieurs objets. Méthode de sauvegarde. De même, il en va de même lorsque la fonction Cat est créée. Vous emmène expliquer en détail la chaîne de prototypes JS


function Cat() {
    this.name = 'Cat';
}

2. Créer une instance Vous emmène expliquer en détail la chaîne de prototypes JSLorsque le constructeur est appelé pour créer une nouvelle instance, l'intérieur du l'instance contiendra un pointeur (propriété interne) vers l'objet prototype du constructeur. Ce pointeur est appelé [[Prototype]] dans ECMA-262 5e édition. Bien qu'il n'existe aucun moyen standard d'accéder à [[Prototype]] dans les scripts, Firefox, Safari et Chrome prennent en charge un attribut __proto__ sur chaque objet. Il est important de préciser que cette connexion existe entre l'instance et l'objet prototype du constructeur, et non entre l'instance et le constructeur.

Vous emmène expliquer en détail la chaîne de prototypes JS

// 将Cat的原型对象指向animal实例,获得animal中的属性,原有的属性丢失
Cat.prototype = animal;

Cette partie est équivalente au pointeur de l'objet prototype of Cat pointe vers l'instance animale, de sorte que l'attribut constructeur d'origine dans l'objet prototype Cat est perdu et remplacé par les attributs de l'instance animal, y compris l'attribut name et l'attribut interne __proto__. En même temps, l'attribut __proto__ pointe également. à Animal.prototype, afin que Cat puisse également rechercher les propriétés et les méthodes appelées dans Animal via la chaîne de prototypes. Vous emmène expliquer en détail la chaîne de prototypes JS

// 相当于重新创建了constructor,指向Cat构造函数
Cat.prototype.constructor = Cat;

Cette partie équivaut à recréer un attribut constructeur dans l'objet prototype et à pointer vers le constructeur Cat. Vous emmène expliquer en détail la chaîne de prototypes JS

var cat = new Cat();   // 实例化一个Cat对象,跟实例化Animal相似

3. Appelez la méthode Vous emmène expliquer en détail la chaîne de prototypes JSQuand var animal = new Animal(); l'objet Animal, animal contient une propriété interne qui pointe vers Animal.prototype en d'autres termes, animal n'a aucune relation directe avec le constructeur Animal ; Cependant, vous pouvez voir que même si changeName n'est pas inclus dans l'instance, nous pouvons appeler animal.changeName(name). Ceci est réalisé grâce au processus de recherche des attributs de l'objet, c'est-à-dire :

Recherchez d'abord l'instance. dans l'instance S'il existe une méthode changeName dans animal, sinon continuez la recherche, allez sur Animal.prototype pour savoir s'il existe une méthode changeName, si c'est le cas, appelez-la, sinon continuez la recherche, recherchez dans Object. prototype, s'il n'est pas trouvé au final, un null sera renvoyé.

animal.changeName('Tiger');
Évidemment, il n'y a pas de méthode changeName dans l'instance animal ici, vous devez donc aller sur Animal.prototype pour trouver la méthode changeName et l'appeler pour réussir à modifier l'attribut name dans l'instance animal en Tiger.

À ce stade, puisque Cat.prototype pointe vers l'instance animal, l'attribut name dans Cat.prototype devient également Tiger.

Vous emmène expliquer en détail la chaîne de prototypes JS

console.log(cat.name)  // Cat

最后,获取cat.name,与查找方法同样,也是先去实例中cat查找是否含有name属性,在这里很明显是存在的,因此直接结束寻找,此时cat.name = 'Cat'。

三、总结

通过这道题,加深了我对原型和原型链的理解,其实这道题也可以扩展到关于继承的知识点,在JavaScript中实现继承主要是依靠原型链来实现。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
es6数组怎么去掉重复并且重新排序es6数组怎么去掉重复并且重新排序May 05, 2022 pm 07:08 PM

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

JavaScript对象的构造函数和new操作符(实例详解)JavaScript对象的构造函数和new操作符(实例详解)May 10, 2022 pm 06:16 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

JavaScript面向对象详细解析之属性描述符JavaScript面向对象详细解析之属性描述符May 27, 2022 pm 05:29 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

javascript怎么移除元素点击事件javascript怎么移除元素点击事件Apr 11, 2022 pm 04:51 PM

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

什么作用域链和原型链什么作用域链和原型链Nov 13, 2023 pm 01:46 PM

作用域链和原型链是JavaScript中两个重要的概念,分别对应着作用域和继承两个核心特性:1、作用域链是JavaScript中用来管理变量访问和作用域的机制,其形成是由函数创建时所处的执行上下文环境和词法作用域决定的;2、原型链是JavaScript中实现继承的机制,基于对象之间的原型关系,当访问对象的属性或方法时,如果该对象本身没有定义,会沿着原型链向上查找。

什么是原型和原型链什么是原型和原型链Nov 09, 2023 pm 05:59 PM

原型,js中的一个对象,用于定义其他对象的属性和方法,每个构造函数都有一个prototype属性,这个属性是一个指针,指向一个原型对象,当创建新对象时,这个新对象会从其构造函数的prototype属性继承属性和方法。原型链,当试图访问一个对象的属性时,js会首先检查这个对象是否有这个属性,如果没有,那么js会转向这个对象的原型,如果原型对象也没有这个属性,会继续查找原型的原型。

foreach是es6里的吗foreach是es6里的吗May 05, 2022 pm 05:59 PM

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

20+道必知必会的Vue面试题(附答案解析)20+道必知必会的Vue面试题(附答案解析)Apr 06, 2021 am 09:41 AM

本篇文章整理了20+Vue面试题分享给大家,同时附上答案解析。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Navigateur d'examen sécurisé

Navigateur d'examen sécurisé

Safe Exam Browser est un environnement de navigation sécurisé permettant de passer des examens en ligne en toute sécurité. Ce logiciel transforme n'importe quel ordinateur en poste de travail sécurisé. Il contrôle l'accès à n'importe quel utilitaire et empêche les étudiants d'utiliser des ressources non autorisées.

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Puissant environnement de développement intégré PHP

SublimeText3 version anglaise

SublimeText3 version anglaise

Recommandé : version Win, prend en charge les invites de code !

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel