es6中的class有没有静态属性
时间:2023-02-15 12:05
es6中的class没有静态属性。静态属性是class本身的属性,即直接定义在类内部的属性( Class.propname ),不需要实例化;但ES6中规定,Class内部只有静态方法,没有静态属性。 本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。 在ES6中,class (类)作为对象的模板被引入,可以通过 class 关键字定义类。 class 的本质是 function。 它可以看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法。 ES6 Class 静态方法、属性和实例属性 类相当于实例的原型, 所有在类中定义的方法, 都会被实例继承。 如果在一个方法前, 加上static关键字, 就表示该方法不会被实例继承, 而是直接通过类来调用, 这就称为“ 静态方法”。 上面代码中, Foo类的classMethod方法前有static关键字, 表明该方法是一个静态方法, 可以直接在Foo类上调用( Foo.classMethod()), 而不是在Foo类的实例上调用。 如果在实例上调用静态方法, 会抛出一个错误, 表示不存在该方法。 上面代码中, 父类Foo有一个静态方法, 子类Bar可以调用这个方法。 静态方法也是可以从super对象上调用的。 静态属性 静态属性指的是 Class 本身的属性, 即Class.propname, 而不是定义在实例对象( this) 上的属性。 上面的写法为Foo类定义了一个静态属性prop。 目前, 只有这种写法可行, 因为 ES6 明确规定, Class 内部只有静态方法, 没有静态属性。 ES7 有一个静态属性的提案, 目前 Babel 转码器支持。 这个提案对实例属性和静态属性, 都规定了新的写法。 ( 1) 类的实例属性 类的实例属性可以用等式, 写入类的定义之中。 上面代码中, myProp就是MyClass的实例属性。 在MyClass的实例上, 可以读取这个属性。 上面代码中, 构造方法constructor里面, 定义了this.state属性。 这种写法比以前更清晰。 为了可读性的目的, 对于那些在constructor里面已经定义的实例属性, 新写法允许直接列出。 (2) 类的静态属性 类的静态属性只要在上面的实例属性写法前面, 加上static关键字就可以了。 同样的, 这个新写法大大方便了静态属性的表达。 上面代码中, 老写法的静态属性定义在类的外部。 整个类生成以后, 再生成静态属性。 这样让人很容易忽略这个静态属性, 也不符合相关代码应该放在一起的代码组织原则。 另外, 新写法是显式声明( declarative), 而不是赋值处理, 语义更好。 以上就是es6中的class有没有静态属性的详细内容,更多请关注gxlsystem.com其它相关文章!class Foo {
static classMethod() {
return 'hello';
}
}
Foo.classMethod() // 'hello'
var foo = new Foo();
foo.classMethod()
// TypeError: foo.classMethod is not a function
父类的静态方法, 可以被子类继承。class Foo {
static classMethod() {
return 'hello';
}
}
class Bar extends Foo {}
Bar.classMethod(); // 'hello'
class Foo {
static classMethod() {
return 'hello';
}
}
class Bar extends Foo {
static classMethod() {
return super.classMethod() + ', too';
}
}
Bar.classMethod();
class Foo {}
Foo.prop = 1;
Foo.prop // 1
// 以下两种写法都无效
class Foo {
// 写法一
prop: 2
// 写法二
static prop: 2
}
Foo.prop // undefined
class MyClass {
myProp = 42;
constructor() {
console.log(this.myProp); // 42
}
}
以前, 我们定义实例属性, 只能写在类的constructor方法里面。class ReactCounter extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
}
有了新的写法以后, 可以不在constructor方法里面定义。class ReactCounter extends React.Component {
state = {
count: 0
};
}
class ReactCounter extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
state;
}
class MyClass {
static myStaticProp = 42;
constructor() {
console.log(MyClass.myProp); // 42
}
}
// 老写法
class Foo {}
Foo.prop = 1;
// 新写法
class Foo {
static prop = 1;
}