• 技术文章 >web前端 >js教程

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

    伊谢尔伦伊谢尔伦2017-07-27 11:25:25原创891

    在 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私有成员方式代码详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:javascript weakmap symbol
    上一篇:javascript私有成员的实现方式实例详解 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 一文浅析node中如何使用消息队列• 【翻译】使用自定义hooks对React组件进行重构• 一文详解Node中express的身份认证• Angular学习之聊聊生命周期• 浅析Angular中的自定义结构型/属性型指令
    1/1

    PHP中文网