在ES6
中(和ES5
相比),class
的new
实例有以下特点:
class
的构造参数必须是new
来调用,不可以将其作为普通函数执行es6
的class
不存在变量提升prototype
上的方法可以枚举。为此我做了以下测试代码进行验证:
console.log(ES5Class()); // es5:可以直接作为函数运行
// console.log(new ES6Class()) // 会报错:不存在变量提升
function ES5Class() {
console.log("hello");
}
ES5Class.prototype.func = function() {
console.log("Hello world");
};
class ES6Class {
constructor() {}
func() {
console.log("Hello world");
}
}
let es5 = new ES5Class();
let es6 = new ES6Class();
// 推荐在循环对象属性的时候,使用for...in
// 在遍历数组的时候的时候,使用for...of
console.log("ES5 :");
for (let _ in es5) {
console.log(_);
}
// es6:不可枚举
console.log("ES6 :");
for (let _ in es6) {
console.log(_);
}
在C语言中,使用 static 关键字来增加函数变量的生命周期(不是范围),使其超出函数的调用范围。
在JS/TS中,也可以实现。通过class
:
const { called } = new (class {
count = 0;
called = () => {
this.count++;
console.log("Called: ", this.count);
};
})();
called(); called();
也可以用闭包:
const { called: called2 } = (() => {
var count = 0;
return {
called: () => {
count++;
console.log("Called: ", count);
}
};
})();
called2();
called2();
使用 class 的 name属性
+ generator 方法:
//定义类
class Foo {
constructor(...args) {
this.args = args;
}
*[Symbol.iterator]() {
for (let arg of this.args) {
yield arg;
}
}
}
var foo = new Foo(1, 2, 3);
for (let x of foo) {
console.log(x);
}
问题描述:
class Logger {
constructor(name) {
this.name = name;
}
print() {
console.log(this.name);
}
}
const logger = new Logger('sysdesign.fun');
const { print } = logger;
print(); // this 指针丢失。TypeError: Cannot read property 'name' of undefined
解决1: 构建函数中,绑定 this