ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptプライベートメンバーのシンボル+ウィークマップ実装の詳細コード説明

JavaScriptプライベートメンバーのシンボル+ウィークマップ実装の詳細コード説明

伊谢尔伦
伊谢尔伦オリジナル
2017-07-27 11:25:251523ブラウズ

WeakMap の最大の問題は、弱い参照を shim できないことです。第 2 の問題は、デバッグに不便であることです。

shim によって生成される WeakMap は、インスタンスのライフサイクルを追跡できないことが主な理由であり、インスタンス上のプライベート メンバーのライフサイクルはインスタンスに依存するため、インスタンス レベルのプライベートを置くのは良いことではないでしょうかインスタンスのメンバー? インスタンスが消滅すると、その属性は自然に破壊されます。プライベート ストレージ領域は Symol を使用して非表示にすることができます。

このソリューションは、外部からは見えず、クロージャ関数を通じて内部的に取得されるプライベート トークン関数を返す createPrivate 関数を提供します。現在のインスタンスを渡すと、現在のインスタンスのプライベート ストレージ領域が返されます。使用法は次のとおりです:

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

コードの主な目的は、createPrivate 関数を実装することです。おおよその実装は次のとおりです:

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

上記の実装には、2 つのストレージ層があります。privateStore 層は、統合されたプライベート メンバー ストレージです。 classToken はインスタンス上の領域であり、継承レベル間の異なるクラスの Private メンバ定義に対応します。基底クラスには基底クラスのプライベート メンバ領域があり、サブクラスと基底クラスのプライベート メンバ領域は異なります。

もちろん、ストレージの 2 つのレイヤーのみを実装することもできます。これらのストレージのレイヤーは、デバッグの便宜のためだけに使用され、インスタンスの各レベルのプライベート部分を表示するために直接使用できます。コンソール。

以上がJavaScriptプライベートメンバーのシンボル+ウィークマップ実装の詳細コード説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。