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!