记录class的学习笔记,在回答别人的问题时发现本身的的理解偏差很大javascript
在没有es6带来的class的时候,咱们编写JavaScript的时候不少时候会经过构造函数和原型链来添加方法属性,实现class的功能。java
// Box是一个构造器 function Box(color) { this.type = 'circle'; this.color = color; } // 咱们能够经过prototype的方式来加一条实例方法 Person.prototype.hello = function() { console.log('hello ' + this.color); } // 对于私有属性(Static method),咱们固然不能放在原型链上了。咱们能够直接放在构造函数上面 Person.fn = function() { console.log('static'); }; //经过new来建立 var circle = new Box('red');
可是在es6的规范中,可使用class语法,ES6 的class能够看做只是一个语法糖,它的绝大部分功能,ES5 均可以作到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。上面的代码用 ES6 的class改写,就是下面这样。es6
class Box { constructor(color) { this.color = color; this.type="corcle" } hello() { console.log('hello ' + this.name); } static fn() { console.log('static'); }; }
上面代码定义了一个“类”,能够看到里面有一个constructor方法,这就是构造方法,而this关键字则表明实例对象。编程
须要注意:
1.class内的方法不须要function
关键字,直接把函数定义放进去了就能够了。
2.另外,方法之间不须要逗号分隔,加了会报错。
3.class内部默认是严格模式,
须要注意这个和JavaScript
中的对象写法是不同的。而是当作是构造函数的写法。并且目前使用typeof
来判断class
的类型的时候返回的结果是function
。函数
constructor方法是类的默认方法,经过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,若是没有显式定义,一个空的constructor方法会被默认添加。学习
class Box { } // 等同于 class Box { constructor() {} }
就像使用构造函数同样使用new
命令来建立一个实例。若是忘记加上new
,像函数那样调用Class
,将会报错。this
class Box{...} var circle = new Box();
class的实例对象就和普通的对象相似,都是能够看过是经过new
一个构造函数生成的,prototype
这里有几个问题须要注意:code
class
表达式就像函数表达式同样,能够把class
来赋值给变量,class
不存在变量提高,内部默认严格模式
暂时没有标准的支持私有方法和私有属性this
的指向是class
实例对象,须要注意若是在外单独调用方法时须要当心this
的指向Generator
函数前面添加*
便可对象
类至关于实例的原型,全部在类中定义的方法,都会被实例继承。若是在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接经过类来调用,这就称为“静态方法”。
注意,若是静态方法包含this关键字,这个this指的是类,而不是实例。
ES6 明确规定,Class 内部只有静态方法,没有静态属性。因此应该这样书写一个静态属性:
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 } }
类的静态属性只要在上面的实例属性写法前面,加上static关键字就能够了。
class MyClass { static myStaticProp = 42; constructor() { console.log(MyClass.myStaticProp); // 42 } }