Symbol 异步处理 私有变量 WeakMap

目录

Symbol

异步处理

nodejs

实现思路

私有变量

约定

闭包

Symbol 

WeakMap

大家的福利:福利 


 

Symbol

Symbol函数栈不能用new命令,因为Symbol是原始数据类型,不是对象,可以接受一个字符串作为参数,为新创建的Symbol提供的描述,用来显示在控制台或者作为字符串的时候使用,便于区分。

  1. Symbol作为属性名,该属性不会出现在for...in,for...of循环中,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有Symbol属性名;
  2. 如果我们希望使用同一个Symbol值,可以使用Symbol.for。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值;
  3. Symbol.keyFor方法返回一个已登记的Symbol类型值的key。

异步处理

nodejs

fs.readdir,readdir方法用于读取目录,返回一个包含文件和目录的数组。

fs.stat,stat方法的参数是一个文件或目录。它产生一个对象,该对象包含了该文件或目录的具体信息。此外,该对象还有一个isFile()方法可以判断正在处理的到底是一个文件,还是目录。

实现思路

  1. 用fs.readdir获取指定目录的内容信息;
  2. 循环遍历内容信息,使用fs.stat获取该文件或者目录的具体信息;
  3. 将具体信息存储起来,当全部存储起来后,筛选其中的是文件的信息;
  4. 遍历比较,找出最大文件,获取并返回最大文件。

私有变量

约定

优点:写法简单;调试方便;兼容性好。

缺点:

  1. 外部可以访问和修改;
  2. 语言没有配合的机制,如for in语句会将所有属性枚举出来。

闭包

/**
 * 实现一
 */
class Example {
  constructor() {
    var _private = '';
    _private = 'private';
    this.getName = function() {return _private}
  }
}

var ex = new Example();

console.log(ex.getName()); // private
console.log(ex._private); // undefined
  • constructor的逻辑变得复杂,构造函数应该只做对象初始化的事情,现在为了实现私有变量,必须包含部分实现方法,代码组织上不清晰;
  • 方法存在于实例,而非原型上,子类也无法使用super调用,构建增加了开销。 

 

/**
 * 实现二
 */
const Example = (function() {
  var _private = '';

  class Example {
    constructor() {
      _private = 'private';
    }
    getName() {
      return _private;
    }
  }

  return Example;

})();

var ex = new Example();

console.log(ex.getName()); // private
console.log(ex._private); // undefined

Symbol 

 

const Example = (function() {
    var _private = Symbol('private');

    class Example {
        constructor() {
          this[_private] = 'private';
        }
        getName() {
          return this[_private];
        }
    }

    return Example;
})();

var ex = new Example();

console.log(ex.getName()); // private
console.log(ex.name); // undefined

WeakMap

 

/**
 * 实现二
 */
const Example = (function() {
  var _private = new WeakMap(); // 私有成员存储容器

  class Example {
    constructor() {
      _private.set(this, 'private');
    }
    getName() {
    	return _private.get(this);
    }
  }

  return Example;
})();

var ex = new Example();

console.log(ex.getName()); // private
console.log(ex.name); // undefined

大家的福利:福利 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值