JavaScript的es6的class使用- SegmentFault 思否
文章推薦指數: 80 %
但是在es6的规范中,可以使用class语法,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法 ...
注册登录问答专栏课程招聘活动发现✓使用“Bing”搜本站使用“Google”搜本站使用“百度”搜本站站内搜索注册登录首页专栏javascript文章详情2JavaScript的es6的class使用caoweiju发布于2017-10-30
记录class的学习笔记,在回答别人的问题时发现自己的的理解误差很大
javascript的class
在没有es6带来的class的时候,我们编写JavaScript的时候很多时候会通过构造函数和原型链来添加方法属性,实现class的功能。
//Box是一个构造器
functionBox(color){
this.type='circle';
this.color=color;
}
//我们可以通过prototype的方式来加一条实例方法
Person.prototype.hello=function(){
console.log('hello'+this.color);
}
//对于私有属性(Staticmethod),我们当然不能放在原型链上了。
我们可以直接放在构造函数上面
Person.fn=function(){
console.log('static');
};
//通过new来创建
varcircle=newBox('red');
但是在es6的规范中,可以使用class语法,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
上面的代码用ES6的class改写,就是下面这样。
classBox{
constructor(color){
this.color=color;
this.type="corcle"
}
hello(){
console.log('hello'+this.name);
}
staticfn(){
console.log('static');
};
}
上面代码定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象。
需要注意:1.class内的方法不需要function关键字,直接把函数定义放进去了就可以了。
2.另外,方法之间不需要逗号分隔,加了会报错。
3.class内部默认是严格模式,需要注意这个和JavaScript中的对象写法是不一样的。
而是看成是构造函数的写法。
而且目前使用typeof来判断class的类型的时候返回的结果是function。
constructor方法
constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。
一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。
classBox{
}
//等同于
classBox{
constructor(){}
}
类的实例对象
就像使用构造函数一样使用new命令来创建一个实例。
如果忘记加上new,像函数那样调用Class,将会报错。
classBox{...}
varcircle=newBox();
class的实例对象就和普通的对象类似,都是可以看过是通过new一个构造函数生成的,
这里有几个问题需要注意:
class表达式就像函数表达式一样,可以把class来赋值给变量,class不存在变量提升,内部默认严格模式暂时没有标准的支持私有方法和私有属性this的指向是class实例对象,需要注意如果在外单独调用方法时需要小心this的指向Generator函数前面添加*即可
静态属性和方法
静态方法
类相当于实例的原型,所有在类中定义的方法,都会被实例继承。
如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
注意,如果静态方法包含this关键字,这个this指的是类,而不是实例。
静态属性
ES6明确规定,Class内部只有静态方法,没有静态属性。
所以应该这样书写一个静态属性:
classFoo{
}
Foo.prop=1;
Foo.prop//1
下面是错误的举一反三:
//以下两种写法目前都无效
classFoo{
//写法一
prop:2
//写法二
staticprop:2
}
Foo.prop//undefined
新提案中的静态属性、实例属性
不过目前已经有了新的提案来支持类的静态属性和实例属性,
实例属性
类的实例属性可以用等式,写入类的定义之中。
classMyClass{
myProp=42;
constructor(){
console.log(this.myProp);//42
}
}
静态属性
类的静态属性只要在上面的实例属性写法前面,加上static关键字就可以了。
classMyClass{
staticmyStaticProp=42;
constructor(){
console.log(MyClass.myStaticProp);//42
}
}
javascriptes6classconstructor阅读8.5k发布于2017-10-30赞2收藏1分享本作品系原创,采用《署名-非商业性使用-禁止演绎4.0国际》许可协议caoweijuclassMyself{1.5k声望51粉丝关注作者0条评论得票最新提交评论caoweijuclassMyself{1.5k声望51粉丝关注作者文章目录跟随宣传栏▲21
延伸文章資訊
- 1JavaScript Class (類別) - Shubo 的程式開發筆記
這篇文章將會解釋JavaScript class 的觀念以及使用方法,包含class ... 不過也有人提出看法,不鼓勵Arrow Functions in Class Properties 的用法。
- 2吃一顆Class 語法糖(上) - iT 邦幫忙- iThome
- 3JavaScript的es6的class使用- SegmentFault 思否
但是在es6的规范中,可以使用class语法,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法 ...
- 4JavaScript | ES6 中最容易誤會的語法糖Class - 基本用法
Instance 能夠使用Class 內的Method,並藉由Method 存取Object 內的資料。 咦?就算沒寫過,但這樣看起來似乎和JavaScript 的Constructor 及In...
- 5[筆記] 談談JavaScript ES6中的Classes - PJCHENder
由於class的用法在許多程式語言中都相當普遍,因此在最新的ES6中也會添加Class的用法,然而,這種用法雖然是使用class,但實際上和classical ...