ES6 javascript中class静态方法、属性与实例属性用法示例
本文实例讲述了es6 javascript中class静态方法、属性与实例属性用法。分享给大家供大家参考,具体如下:
类相当于实例的原型, 所有在类中定义的方法, 都会被实例继承。 如果在一个方法前, 加上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类的实例上调用。 如果在实例上调用静态方法, 会抛出一个错误, 表示不存在该方法。
父类的静态方法, 可以被子类继承。
class foo { static classmethod() { return 'hello'; } } class bar extends foo {} bar.classmethod(); // 'hello'
上面代码中, 父类foo有一个静态方法, 子类bar可以调用这个方法。
静态方法也是可以从super对象上调用的。
class foo { static classmethod() { return 'hello'; } } class bar extends foo { static classmethod() { return super.classmethod() + ', too'; } } bar.classmethod();
静态属性
静态属性指的是 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
es7 有一个静态属性的提案, 目前 babel 转码器支持。
这个提案对实例属性和静态属性, 都规定了新的写法。
(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 { constructor(props) { super(props); this.state = { count: 0 }; } state; }
(2) 类的静态属性
类的静态属性只要在上面的实例属性写法前面, 加上static关键字就可以了。
class myclass { static mystaticprop = 42; constructor() { console.log(myclass.myprop); // 42 } }
同样的, 这个新写法大大方便了静态属性的表达。
// 老写法 class foo {} foo.prop = 1; // 新写法 class foo { static prop = 1; }
上面代码中, 老写法的静态属性定义在类的外部。 整个类生成以后, 再生成静态属性。 这样让人很容易忽略这个静态属性, 也不符合相关代码应该放在一起的代码组织原则。 另外, 新写法是显式声明( declarative), 而不是赋值处理, 语义更好。
更多相关内容可查看本站专题:《ecmascript6(es6)入门教程》、《javascript数组操作技巧总结》、《javascript字符与字符串操作技巧总结》、《javascript数据结构与算法技巧总结》、《javascript错误与调试技巧总结》及《javascript数学运算用法总结》
希望本文所述对大家基于ecmascript的程序设计有所帮助。
下一篇: 狗子好幸福,还能享受空调待遇
推荐阅读
-
ES6 javascript中class类的get与set用法实例分析
-
ES6 javascript中class静态方法、属性与实例属性用法示例
-
ES6 javascript中class静态方法、属性与实例属性用法示例
-
ES6 javascript中类的静态方法,属性与实例属性怎么使用
-
ES6 javascript中class类的get与set用法实例分析
-
ES6 javascript中类的静态方法,属性与实例属性怎么使用
-
JavaScript中函数属性方法apply和call用法实例详解
-
ES6 javascript中class类的get与set用法实例
-
PHP中类属性与类静态变量的访问方法实例
-
JavaScript中函数属性方法apply和call用法实例详解