您好,欢迎访问一九零五行业门户网

symbol + weakmap实现javascript私有成员方式代码详解

在 weakmap中最大的问题是无法 shim 弱引用,较次要的问题是不大方便调试。
shim 出来的 weakmap 主要是无法追溯实例的生命周期,而实例上的私有成员的生命周期又是依赖实例, 因此将实例级别的私有成员部分放在实例上不就好了? 实例没了,自然其属性也随之摧毁。而私有存储区域的隐藏则可以使用 symol 来做。
该方案的提供一个 createprivate 函数,该函数会返回一个私有的 token 函数,对外不可见,对内通过闭包函数获得, 传入当前实例会返回当前实例的私有存储区域。使用方式如下:
(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]; }; }
上述实现做了两层存储,privatestore 这层是实例上统一的私有成员存储区域,而 classtoken 对应的则是继承层次之间不同类的私有成员定义,基类有基类的私有成员区域,子类和基类的私有成员区域是不同的。
当然,只做一层的存储也可以实现,两层存储仅仅是为了调试方便,可以直接在控制台通过symbol(‘privatestore')这个属性来查看实例各个层次的私有部分。
以上就是symbol + weakmap实现javascript私有成员方式代码详解的详细内容。
其它类似信息

推荐信息