在js的类中,可分为三种方法,constructor构造方法、静态方法与普通方法。
类的作用在于构建对象,而constructor构造方法就是用于构建对象实例。
在使用new关键字生成对象时,constructor方法会被执行,最终return的结果就是生成的对象实例。 当一个类没有constructor方法时会自动生成一个空的constructor方法,返回结果为空。 用new关键字实例化对象时传入的参数会做为constructor构造函数的参数传入。
class Point { constructor(name) { console.log('Instantiate objects:'+ name); } } new Point('testObj'); //Instantiate objects:testObj
class类的普通方法可以看作是构造函数的另一种写法,相当于在类的prototype属性上上边定义方法。
class Point { toString() { // ... } } //等同于 class Point { } Point.prototype={ toString() { // ... } }
class Point { toString() { // ... } } let obj = new Point(); obj.toString();
class Point { toString() { // ... } } Point.prototype.toString();
class Foo { commonMethod() { return 'hello'; } } class Bar extends Foo { } Bar.__proto__.prototype.commonMethod();
想要弄懂这个原理请先弄懂ES5中原型链、隐式原型链相关知识点。
类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用(通过类调用指在该类之外调用),这就称为“静态方法”。
静态方法只能在当前类上调用,不能被该类的实例对象调用。父类的静态方法可以被子类继承。
因此静态方法被调用的方式一共有三种(三种调用方式都在下面一段代码中使用到了,请耐心):
- 父类直接调用
- 子类继承父类后调用
- 子类通过super对象调用
class Foo { static classMethod() { return 'hello'; } } Foo.classMethod(); //hello class Bar extends Foo { } class Cla extends Foo { return super.classMethod(); //hello } Bar.classMethod(); //hello
对比 | 静态方法 | 普通方法 | 构造方法 |
---|---|---|---|
关键字 | static | 无 | constructor |
使用场景 | 声明一个仅供当前类或当前类的子类使用的方法 | 创建实例化对象可直接调用的方法 | 在用new关键字通过此类实例化对象时执行的方法 |
使用对象 | 当前类或当前类的子类 | 通过该类或该类的子类实例化生成的对象 | 该类自身 |
调用方法 | 1.父类直接调用 2.子类继承父类后调用 3.子类通过super对象调用 |
1.通过该类及该类的子类实例生成的对象调用 2.该类通过prototype调用 3.该类的子类通过__proto__隐式原型链调用 |
1.该类实例化对象时调用 2.该类的子类使用super关键字调用 |
如对本文有疑问, 点击进行留言回复!!
MFC的静态库.lib、动态库.dll(包含引入库.lib)以及Unicode库示例
CTF 刷题记录(一) 白云新闻搜索(手动与自动化SQL注入)
javascript如何使用函数random来实现课堂随机点名方法详解
网友评论