一:注意点:
1、继承父级的公有方法,静态方法不能继承
2、super在继承时调用;调用父类的constroctor;
3、在定义之前调用会产生暂时性死区;
console.log(new Person()) // 产生暂时性死区
class Person{}
4、定义私有属性的方法
class Person {
constructor () {
this.a = 1; // 私有属性
}
b = 2; // 不常用
say () {} // 公有属性
}
console.log(new Person()); // Person {b: 2, a: 1}
5、定义公有的方法
class Person {
constructor () {
this.a = 1; // 私有属性
}
b = 2; // 不常用
sleep () {} // 公有 类似 Person.prototype.sleep = function () {}
say () {} // 公有属性
}
console.log(new Person()); // Person {b: 2, a: 1}
6、公有方法私有化
a: Symbol类型定义属性;
b: 将函数定义到外部,内部访问不到
let eat = Symbol('foo')
class Person {
constructor () {
this.name = 'zs'
}
say () {
console.log(`say方法`);
}
[eat] () { // 公有方法私有化;
console.log(`Symbol类型${eat}的方法`);
}
}
new Person().say();
let p = new Person();
console.log(p);
将函数定义到外部,内部访问不到
let eat = Symbol('foo')
class Person {
constructor () {
this.name = 'zs'
}
say () {
eat.call(this)
}
}
function eat () {
this.food = '123'
}
new Person().say();
let p = new Person();
console.log(p);
7、定义静态方法static 可有类构造器调用,实例不能继承调用
class Person {
constructor() {
this.name = 'zs';
}
static say() {
console.log('hello');
}
sayName () {
console.log('zs')
}
}
new Person().sayName() // zs
Person.say(); // hello
// ============================
// 传统定义方式
function foo () {}
foo.sayName = function () {
console.log('hello');
}
console.log(foo.sayName())
8、set和get修饰符
class Person {
constructor() {
this.name = 'zs';
}
get a () {
console.log('1')
}
set b (val) {
console.log(2);
}
}
let p = new Person();
console.log(p) // Person {name: 'zs', a:....}
二:总结:
1、class类定义的共有属性是不可枚举的 ; Person.prototype.say = function () {}; 定义的方法是可枚举的
(1)、class与let 在声明之前调用会产生暂时性死区(TDZ)
(2)、公有方法不可枚举,以前的方法可枚举
(3)、默认严格模式
(4)、类中会有一个默认的constructor, 不写不会报错
(5)、类的调用需 new 的方法执行