Maison > Article > interface Web > Quelles sont les deux catégories d'objets JavaScript ?
Il existe deux types d'objets en JavaScript : 1. Les objets hôtes sont des objets fournis par l'environnement hôte JavaScript, et leur comportement est entièrement déterminé par l'environnement hôte ; 2. Les objets intégrés sont des objets fournis par l'objet fourni par le langage JavaScript ; .
L'environnement d'exploitation de ce tutoriel : système Windows 7, JavaScript version 1.8.5, ordinateur Dell G3.
En JavaScript, les objets peuvent être divisés en deux types : les objets hôtes et les objets intégrés.
Objets hôtes : objets fournis par l'environnement hôte JavaScript. Leur comportement est entièrement déterminé par l'environnement hôte.
Objets intégrés : objets fournis par le langage JavaScript
Objets intrinsèques : instances d'objets automatiquement créées lors de la création du runtime JavaScript, spécifiées par la norme.
Objets natifs : objets qui peuvent être créés par les utilisateurs via des constructeurs intégrés tels que Array et RegExp ou une syntaxe spéciale.
Objets ordinaires : objets créés par la syntaxe {}, le constructeur d'objet ou la classe de définition de mot-clé class, qui peuvent être hérités d'un prototype.
Les objets hôtes JavaScript sont de toutes sortes étranges, mais le plus familier sur le front-end est sans aucun doute l'hôte dans l'environnement du navigateur. Dans l'environnement du navigateur, nous savons tous que l'objet global est window et qu'il existe de nombreuses propriétés sur window, telles que document. En fait, une partie des propriétés de la fenêtre de l'objet global provient du langage JavaScript et une partie de l'environnement du navigateur. Les propriétés globales des objets sont spécifiées dans la norme JavaScript et d'autres propriétés de l'objet Window sont spécifiées dans diverses normes du W3C. Les objets hôtes sont également divisés en deux types : inhérents et créés par l'utilisateur. Par exemple, document.createElement peut créer des objets DOM. L'hôte fournira également certains constructeurs. Par exemple, nous pouvons utiliser new Image pour créer des éléments img
Les objets intrinsèques sont des instances d'objet qui sont automatiquement créées lors de la création du runtime JavaScript. la norme. Les objets intrinsèques sont créés avant l'exécution de tout code JavaScript et agissent souvent comme des bibliothèques de base. La « classe » que nous avons mentionnée plus tôt est en fait un type d’objet inhérent. La norme ECMA nous fournit une table d'objets intrinsèques contenant plus de 150 objets intrinsèques.
Nous appelons des objets en JavaScript qui peuvent être créés via le constructeur du langage lui-même appelés objets natifs. Dans le standard JavaScript, plus de 30 constructeurs sont fournis. Selon ma compréhension et selon différents scénarios d'application, je divise les objets natifs dans les catégories suivantes.
Grâce à ces constructeurs, nous pouvons utiliser la nouvelle opération pour créer de nouveaux objets, nous appelons donc ces objets objets natifs. Presque toutes ces fonctionnalités de constructeur ne peuvent pas être implémentées dans du code JavaScript pur, et elles ne peuvent pas être héritées à l'aide de la syntaxe class/extend. La plupart des objets créés par ces constructeurs utilisent des champs privés, tels que :
Error: [[ErrorData]] Boolean: [[BooleanData]] Number: [[NumberData]] Date: [[DateValue]] RegExp: [[RegExpMatcher]] Symbol: [[SymbolData]] Map: [[MapData]]
Ces champs empêchent la méthode d'héritage prototypique de fonctionner correctement, nous pouvons donc penser que tous ces objets natifs sont conçus pour des capacités ou des performances spécifiques. " Objet privilégié ".
J'ai introduit plus tôt la classification générale des objets. En JavaScript, il existe une perspective différente sur l'examen des objets, qui consiste à utiliser des objets pour simuler des fonctions et des constructeurs. Constructeur. En fait, JavaScript réserve un mécanisme de champ privé à ce type d'objet et précise les notions d'objets fonctions abstraites et d'objets constructeurs.
La définition d'un objet fonction est : un objet avec des champs privés [[call]], et la définition d'un objet constructeur est : un objet avec des champs privés [[construct]].
JavaScript utilise la conception de fonctions de simulation d'objets pour remplacer les fonctions dans les langages de programmation généraux. Elles peuvent être appelées et transmettre des paramètres comme les fonctions dans d'autres langages. Tout hôte qui fournit « un objet avec des champs privés [[call]] » peut être pris en charge par la syntaxe d'appel de fonction JavaScript.
Nous pouvons dire que tout objet n'a besoin que d'implémenter [[call]], c'est un objet fonction et peut être appelé en tant que fonction. Et s'il implémente [[construct]], c'est un objet constructeur et peut être appelé en tant que constructeur.
Pour les programmeurs qui fournissent un environnement d'exécution pour JavaScript, les objets hôtes et les objets intégrés (tels que les fonctions Symbol) que nous avons mentionnés ci-dessus peuvent simuler des fonctions et des constructeurs tant que les champs sont conformes.
Bien entendu, la fonction créée par l'utilisateur à l'aide du mot-clé function doit être à la fois une fonction et un constructeur. Cependant, les effets comportementaux qu’ils présentent ne sont pas les mêmes.
Pour les objets hôtes et intégrés, leurs implémentations de [[call]] (appelé en tant que fonction) et [[construct]] (appelé en tant que constructeur) ne sont pas toujours cohérentes.
对于用户使用 function 语法或者 Function 构造器创建的对象来说,[[call]]和[[construct]]行为总是相似的,它们执行同一段代码。我们看一下示例。
function f(){ return 1; } var v = f(); //把f作为函数调用 var o = new f(); //把f作为构造器调用
这样的规则造成了个有趣的现象,如果我们的构造器返回了一个新的对象,那么 new 创建的新对象就变成了一个构造函数之外完全无法访问的对象,这一定程度上可以实现“私有”。
function cls(){ this.a = 100; return { getValue:() => this.a } } var o = new cls; o.getValue(); //100 //a在外面永远无法访问到
除了上面介绍的对象之外,在固有对象和原生对象中,有一些对象的行为跟正常对象有很大区别。
它们常见的下标运算(就是使用中括号或者点来做属性访问)或者设置原型跟普通对象不同,这里我简单总结一下。
Array:Array 的 length 属性根据最大的下标自动发生变化。
Object.prototype:作为所有正常对象的默认原型,不能再给它设置原型了。
String:为了支持下标运算,String 的正整数属性访问会去字符串里查找。
Arguments:arguments 的非负整数型下标属性跟对应的变量联动。
模块的 namespace 对象:特殊的地方非常多,跟一般对象完全不一样,尽量只用于 import 吧。
类型数组和数组缓冲区:跟内存块相关联,下标运算比较特殊。
bind 后的 function:跟原来的函数相关联。
【相关推荐: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!