目录
Symbol
Symbol函数栈不能用new命令,因为Symbol是原始数据类型,不是对象,可以接受一个字符串作为参数,为新创建的Symbol提供的描述,用来显示在控制台或者作为字符串的时候使用,便于区分。
- Symbol作为属性名,该属性不会出现在for...in,for...of循环中,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有Symbol属性名;
- 如果我们希望使用同一个Symbol值,可以使用Symbol.for。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值;
- Symbol.keyFor方法返回一个已登记的Symbol类型值的key。
异步处理
nodejs
fs.readdir,readdir方法用于读取目录,返回一个包含文件和目录的数组。
fs.stat,stat方法的参数是一个文件或目录。它产生一个对象,该对象包含了该文件或目录的具体信息。此外,该对象还有一个isFile()方法可以判断正在处理的到底是一个文件,还是目录。
实现思路
- 用fs.readdir获取指定目录的内容信息;
- 循环遍历内容信息,使用fs.stat获取该文件或者目录的具体信息;
- 将具体信息存储起来,当全部存储起来后,筛选其中的是文件的信息;
- 遍历比较,找出最大文件,获取并返回最大文件。
私有变量
约定
优点:写法简单;调试方便;兼容性好。
缺点:
- 外部可以访问和修改;
- 语言没有配合的机制,如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