类
class chf{ // 创建类
constructor(name) { // 一个类必须有constructor方法 这就是构造方法
this.name = name
}
toString() {
return this.name
}
get prop() { // 取值函数(getter)
return 'getter';
}
set prop(value) { // 存值函数(setter)
console.log('setter: ' + value);
}
};
typeof Point // "function"
Point === Point.prototype.constructor // true
var chff = new chf("陈汉芙"); // 使用的时候,也是直接对类使用new命令,跟构造函数的用法完全一致
var name = chff.toString()
console.log(name) // 陈汉芙
chff.prop = 123; // setter: 123 ‘存值’
chff.prop // getter ’取值‘
class表达式
// 函数表达式形式写法
const MyClass = class Me { // 这个类的名字是Me,但是Me只在 Class 的内部可用,指代当前类。在 Class 外部,这个类只能用MyClass引用
getClassName() {
return Me.name;
}
};
// 如果类的内部没用到的话,可以省略Me,也就是可以写成下面的形式
let MyClass = class{}
// 采用 Class 表达式,可以写出立即执行的 Class。
let person = new class{ // 立即执行类
constructor(x){
this.x = x;
}
getName(){
console.log(this.x)
}
}("陈汉芙");
person.getName();
注意点
(1)严格模式
默认严格模式
(2)不存在提升
new Foo(); // ReferenceError
class Foo {}
(3)name 属性
class Point {}
Point.name // "Point"
(4)Generator 方法
如果某个方法之前加上星号(*),就表示该方法是一个 Generator 函数
(5)this 的指向
类的方法内部如果含有this,它默认指向类的实例。但是,必须非常小心,一旦单独使用该方法,很可能报错
静态方法
类相当于实例的原型,所有在类中定义的方法,都会被实例继承。
如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
class Foo {
static classMethod() {
return 'hello';
}
}
Foo.classMethod() // 'hello'
var foo = new Foo();
foo.classMethod()
// TypeError: foo.classMethod is not a function
上面代码中,Foo类的classMethod方法前有static关键字,表明该方法是一个静态方法,
可以直接在Foo类上调用(Foo.classMethod()),而不是在Foo类的实例上调用。
如果在实例上调用静态方法,会抛出一个错误,表示不存在该方法。
注意,如果静态方法包含this关键字,这个this指的是类,而不是实例。
实例属性的新写法
class IncreasingCounter {
constructor() {
this.chenhanfu= 0;
}
}
改写成 实例属性定义在类的最顶层,其他都不变
class IncreasingCounter {
chenhanfu= 0;
}
静态属性
静态属性指的是 Class 本身的属性,即Class.propName,而不是定义在实例对象(this)上的属性
// 老写法
class Foo {}
Foo.prop = 1; // 类定义了一个静态属性prop,其值为1
Foo.prop // 1
// 新写法
class MyClass {
static myStaticProp = 42;
}
网友评论