es6 Class的静态属性和实例属性实例讲解
Class 的静态属性和实例属性
静态属性指的是 Class 本身的属性,即Class.propName,而不是定义在实例对象(this)上的属性。
class Foo {
}
Foo.prop = 1;
Foo.prop // 1
上面的写法为Foo类定义了一个静态属性prop。
目前,只有这种写法可行,因为
ES6 明确规定,Class 内部只有静态方法,没有静态属性。
// 以下两种写法都无效
class Foo {
// 写法一
prop: 2
// 写法二
static prop: 2
}
Foo.prop // undefined
目前有一个静态属性的提案,对实例属性和静态属性都规定了新的写法。
(1)类的实例属性
类的实例属性可以用等式,写入类的定义之中。
class MyClass {
myProp = 42;
constructor() {
console.log(this.myProp); // 42
}
}
上面代码中,myProp就是MyClass的实例属性。在MyClass的实例上,可以读取这个属性。
以前,我们定义实例属性,只能写在类的constructor方法里面。
class ReactCounter extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
}
上面代码中,构造方法constructor里面,定义了this.state属性。
有了新的写法以后,可以不在constructor方法里面定义。
class ReactCounter extends React.Component {
state = {
count: 0
};
}
这种写法比以前更清晰。
为了可读性的目的,对于那些在constructor里面已经定义的实例属性,新写法允许直接列出。
class ReactCounter extends React.Component {
state;
constructor(props) {
super(props);
this.state = {
count: 0
};
}
}
(2)类的静态属性
类的静态属性只要在上面的实例属性写法前面,加上static关键字就可以了。
class MyClass {
static myStaticProp = 42;
constructor() {
console.log(MyClass.myStaticProp); // 42
}
}
同样的,这个新写法大大方便了静态属性的表达。
// 老写法
class Foo {
// ...
}
Foo.prop = 1;
// 新写法
class Foo {
static prop = 1;
}
上面代码中,老写法的静态属性定义在类的外部。整个类生成以后,再生成静态属性。这样让人很容易忽略这个静态属性,也不符合相关代码应该放在一起的代码组织原则。另外,新写法是显式声明(declarative),而不是赋值处理,语义更好。
上一篇: SpringBoot参数校验的方法总结
推荐阅读
-
HTML5新增的表单元素和属性实例解析
-
JS获得一个对象的所有属性和方法实例
-
Bootstrap的aria-label和aria-labelledby属性实例详解
-
vue给对象动态添加属性和值的实例
-
javascript遍历json对象的key和任意js对象属性实例
-
JS高级---实例对象使用属性和方法层层的搜索 (实例对象-->原型对象-->报错)
-
Excel VBA之控制工作表显示和隐藏的Visible属性实例学习及参数解析
-
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
-
实例讲解CSS3中的border-radius属性
-
python 通过xml获取测试节点和属性的实例