Maison  >  Article  >  interface Web  >  Explication détaillée du code du symbole + mise en œuvre de la carte faible des membres privés JavaScript

Explication détaillée du code du symbole + mise en œuvre de la carte faible des membres privés JavaScript

伊谢尔伦
伊谢尔伦original
2017-07-27 11:25:251525parcourir

Le plus gros problème de WeakMap est qu'il ne peut pas caler les références faibles. Le problème secondaire est qu'il n'est pas pratique pour le débogage. Le WeakMap produit par

shim est principalement dû au fait qu'il ne peut pas retracer le cycle de vie de l'instance, et le cycle de vie des membres privés de l'instance dépend de l'instance. Par conséquent, ne serait-il pas bon de le mettre. les membres privés au niveau de l'instance sur l'instance ? Lorsque l'instance disparaît, ses attributs sont naturellement détruits. La zone de stockage privée peut être masquée à l'aide de Symol.

Cette solution fournit une fonction createPrivate, qui renverra une fonction de jeton privé, invisible pour le monde extérieur et obtenue en interne via la fonction de fermeture. Le passage dans l'instance actuelle renverra la zone de stockage privée de. l'instance actuelle. L'utilisation est la suivante :

(function() {
   var $private = createPrivate(); // 私有成员 token 函数,可以传入对象参数,会作为原型链上的私有成员
   function MyClass() {
     $private(this).privateProp = ‘privateProp' ; // 闭包内引用到privateStore, 用当前实例做 key,设置私有成员
   }
   MyClass.prototype.getPrivateProp = function () {
     return $private(this).privateProp;
   };
})();
var my = new MyClass();
alert(my.getPrivateProp()); // ‘privateProp';
alert(my.privateProp); // 弹出 undefined,实例上并没有 privateProp 属性

L'objectif principal du code est d'implémenter la fonction createPrivate. L'implémentation approximative est la suivante :

// createPrivate.js
function createPrivate(prototype) {
  var privateStore = Symbol('privateStore');
  var classToken = Symbol(‘classToken');
  return function getPrivate(instance) {
     if (!instance.hasOwnProperty(privateStore)) {
       instance[privateStore] = {};
     }
    var store = instance[classToken];
     store[token] = store[token] || Object.create(prototype || {});
     return store[token];
   };
}

L'implémentation ci-dessus comporte deux couches. de stockage.La couche privateStore est unifiée sur la zone de stockage des membres privés, et classToken correspond aux définitions de membres privés des différentes classes entre les niveaux d'héritage. les zones membres de la sous-classe et de la classe de base sont différentes.

Bien sûr, une seule couche de stockage peut également être implémentée. Les deux couches de stockage sont uniquement destinées à faciliter le débogage. Vous pouvez directement utiliser l'attribut Symbol (« privateStore ») sur la console pour afficher les parties privées. de chaque niveau de l'instance.

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:
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