Heim >Web-Frontend >js-Tutorial >Detaillierte Code-Erklärung der Symbol- und Weakmap-Implementierung privater JavaScript-Mitglieder

Detaillierte Code-Erklärung der Symbol- und Weakmap-Implementierung privater JavaScript-Mitglieder

伊谢尔伦
伊谢尔伦Original
2017-07-27 11:25:251555Durchsuche

Das größte Problem bei WeakMap besteht darin, dass schwache Referenzen nicht unterdrückt werden können. Das sekundäre Problem besteht darin, dass es für das Debuggen nicht geeignet ist. Die von

shim erstellte WeakMap liegt hauptsächlich daran, dass sie den Lebenszyklus der Instanz nicht verfolgen kann und der Lebenszyklus der privaten Mitglieder der Instanz von der Instanz abhängt. Wäre es daher nicht gut, dies zu sagen? die privaten Mitglieder auf Instanzebene auf der Instanz? Wenn die Instanz nicht mehr vorhanden ist, werden ihre Attribute auf natürliche Weise zerstört. Der private Speicherbereich kann mit Symol ausgeblendet werden.

Diese Lösung bietet eine createPrivate-Funktion, die eine private Token-Funktion zurückgibt, die für die Außenwelt unsichtbar ist und intern über die Abschlussfunktion erhalten wird. Durch die Übergabe an die aktuelle Instanz wird der private Speicherbereich zurückgegeben die aktuelle Instanz. Die Verwendung ist wie folgt:

(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 属性

Der Code implementiert hauptsächlich die Funktion createPrivate. Die ungefähre Implementierung ist wie folgt:

// 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];
   };
}

Die obige Implementierung erstellt zwei Speicherebenen Die Ebene ist auf dem privaten Mitgliedsspeicherbereich vereinheitlicht, und classToken entspricht den privaten Mitgliedsbereichen verschiedener Klassen zwischen den Vererbungsebenen. Die Basisklasse verfügt über einen privaten Mitgliedsbereich der Unterklasse und die Basisklasse sind unterschiedlich.

Natürlich kann auch nur eine Speicherebene implementiert werden. Die beiden Speicherebenen dienen nur der Vereinfachung des Debuggens. Sie können das Symbol-Attribut ('privateStore') direkt auf der Konsole verwenden, um die privaten Teile anzuzeigen jeder Ebene der Instanz.

Das obige ist der detaillierte Inhalt vonDetaillierte Code-Erklärung der Symbol- und Weakmap-Implementierung privater JavaScript-Mitglieder. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn