• js创建对象私有属性


    创建隐藏属性

    能想到的创建隐藏属性的方法有三种:

    1. 简单的闭包
    2. 通过Symbol
    3. 通过Map,WeakMap

    闭包

    这种方法我们经常使用,例如:

    // 在某个模块中
    function createPeople(name, age) {
      const _age = age;
      return {name, getAge: function() {return _age;}};
    }
    

    通过Symbol

    提出Symbol这个特殊的唯一的值类型,似乎就是专门为了做对象的属性的

    function createPeople(name, age) {
      const _age = Symbol("Age");
      return {name, getAge: function() {return this[_age];}, [_age]: age};
    }
    

    通过Map/WeakMap

    比起Map,我觉的如果是保存对象的私有属性的话,WeakMap更美丽,因为它可以保存对象的弱引用

    // Map实现
    function createPeople(name, age) {
      const map = new Map();
      map.set("age", age);
      return {name, getAge: function() {return map.get("age");}}
    }
    // WeakMap 实现
    const wMap = new WeakMap();
    function createPeople2(name, age) {
      const ret = {name, getAge: function() {return wMap.get(this).age;}};
      const pravite = {};
      wMap.set(ret, pravite);
    
      pravite.age = age;
      return ret;
    }
    

    同时,实际上在ES2020中已经提供了原生的类定义私有属性的支持,只需要填上一个#,那么他就是私有的了:

    class People {
        constructor(name, age) {
            this.name = name;
            this.age = age;
        }
        
        #fart() {
          console.log("fart");
        }
    }
    

    现在至少在我的Chrome 83+上,是可用的

  • 相关阅读:
    ZOJ3626(树形dp)
    poj2486(树形dp)
    byte的范围-128-127
    div里面放img
    css为什么要定最小宽度和最大宽度,最小宽度和最大宽度有什么用
    Js中的apply和call
    Jquery点击事件出发顺序
    Jquery操作Dom
    Jquery选择器
    Django用ajax发送post请求时csrf拦截的解决方案
  • 原文地址:https://www.cnblogs.com/freesfu/p/12936852.html
Copyright © 2020-2023  润新知