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