21class的基本语法
//在class类中,有一个constructor构造方法,this关键字则代表实例对象。
class MyClass { }
typeof MyClass //"function"
MyClass === MyClass.prototype.constructor //true
//类的数据类型就是函数,类本身就指向构造函数
//类的所有方法都定义在类的prototype属性上面,在类的实例上面
//在类的实例上面调用方法,其实就是调用原型上的方法
class B { }
let b = new B();
b.constructor === B.prototype.constructor
//类的新方法可以添加在prototype对象上面
Object.assign(MyClass.prototype, {
toString() { },
toValue() { }
})
//prototype的constructor属性直接指向类的本身
MyClass.prototype.constructor === MyClass
//类的内部所有定义的方法都是不可枚举的,这一点与ES5的行为不一致
//constructor方法默认返回实例对象,完全可以指定返回另外一个对象
class Foo {
constructor() {
return Object.create(null);
}
}
new Foo() instanceof Foo //false
//类的实例,与es5一样,实例的属性除非是显示定义在其本身上(即定义在this对象上),否则都是定义在原型上(即class上)
var myclass = new MyClass()
myclass.hasOwnProperty("toString") //false
myclass.__proto__.hasOwnProperty("toString") //true
//类的所有实例共享一个原型对象
//getter setter在类的内部可以使用get和set对某个属性设置存值函数和取值函数,拦截改属性的存取行为
class C {
get prop() {
return 'getter'
}
set prop(value) {
console.log(value)
}
}
//存值函数和取值函数是设置在属性的Descriptor对象上的
var descriptor = Object.getOwnPropertyDescriptor(C.prototype, 'prop')
"get" in descriptor //true
"set" in descriptor //true
//属性表达式
let methodName = 'getArea'
class D {
[methodName]() {
}
}
//D类的方法名getArea是从表达式得到的
//class表达式
const MyClass = class Me {
getClassName() {
return Me.name
}
}
//Me只能在class的内部可用,指代当前类。在Class外部,这个类只能用MyClass引用,如果内部没有用到的话,可以省略Me
const MyClass = class { }
//采用Class表达式,可以写出立即执行的Class
let person = new class { }()
/**
* 注意点:
* 1.类不存在变量提升(先定义再使用)
* 2.name属性
* 3.Generator方法(某个方法之前加上*,就表示该方法是一个Generator函数)
* 4.this指向,一般情况下this指向该方法运行时所在的环境;箭头函数中this总是指向定义时
* 所在的对象;
*/
/**
* 静态方法:如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类调用;
* 如果静态方法包含this关键字,这个this指的是类而不是实例;
* 静态方法可以与非静态方法重名,父类的静态方法可以被子类继承,也可以从super对象上调用;
*
* 静态属性:指Class本身的属性,即Class.propName,而不是定义在实例对象上的属性
*/
/**
* 实例属性:除了定义在constructor()方法里面的this上面,也可以定义在类的最顶层
*/
/**
* 私有方法和私有属性:只能在类的内部访问的方法和属性,外部不能访问
* 在方法名前加上"_";直接在模块外部定义方法;利用Symbol值的唯一性,将私有方法的名字命名
* 为一个Symbol值
*/
/**
* new.target属性:一般用在构造函数中,返回new命令作用于的那个构造函数,如果构造函数不是
* 通过new命令或Reflect.construct()调用的,new.target会返回undefined,因此这个属性可以
* 用来确定构造函数是怎么调用的;
* 子类继承父类时,new.target会返回子类(可以写出不能独立使用,必须继承后才能使用的类);
* 在函数外部,使用new.target会报错
*/

浙公网安备 33010602011771号