77JavaScript语言的传统方法是通过构造函数,定义并生成新对象。下面是一个例子。
88
99``` javascript
10- function Point (x ,y ) {
10+ function Point (x , y ) {
1111 this .x = x;
1212 this .y = y;
1313}
1414
1515Point .prototype .toString = function () {
1616 return ' (' + this .x + ' , ' + this .y + ' )' ;
1717};
18+
19+ var p = new Point (1 , 2 );
1820```
1921
2022上面这种写法跟传统的面向对象语言(比如C++和Java)差异很大,很容易让新学习这门语言的程序员感到困惑。
2123
22- ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过` class ` 关键字,可以定义类。基本上,ES6的class可以看作只是一个语法糖 ,它的绝大部分功能,ES5都可以做到,新的` class ` 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。上面的代码用ES6的“类”改写,就是下面这样。
24+ ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过` class ` 关键字,可以定义类。基本上,ES6的 ` class ` 可以看作只是一个语法糖 ,它的绝大部分功能,ES5都可以做到,新的` class ` 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。上面的代码用ES6的“类”改写,就是下面这样。
2325
2426``` javascript
2527// 定义类
@@ -37,12 +39,12 @@ class Point {
3739
3840上面代码定义了一个“类”,可以看到里面有一个` constructor ` 方法,这就是构造方法,而` this ` 关键字则代表实例对象。也就是说,ES5的构造函数` Point ` ,对应ES6的` Point ` 类的构造方法。
3941
40- Point类除了构造方法 ,还定义了一个` toString ` 方法。注意,定义“类”的方法的时候,前面不需要加上` function ` 这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。
42+ ` Point ` 类除了构造方法 ,还定义了一个` toString ` 方法。注意,定义“类”的方法的时候,前面不需要加上` function ` 这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。
4143
4244ES6的类,完全可以看作构造函数的另一种写法。
4345
4446``` javascript
45- class Point {
47+ class Point {
4648 // ...
4749}
4850
@@ -52,6 +54,19 @@ Point === Point.prototype.constructor // true
5254
5355上面代码表明,类的数据类型就是函数,类本身就指向构造函数。
5456
57+ 使用的时候,也是直接对类使用` new ` 命令,跟构造函数的用法完全一致。
58+
59+ ``` javascript
60+ class Bar {
61+ doStuff () {
62+ console .log (' stuff' );
63+ }
64+ }
65+
66+ var b = new Bar ();
67+ b .doStuff () // "stuff"
68+ ```
69+
5570构造函数的` prototype ` 属性,在ES6的“类”上面继续存在。事实上,类的所有方法都定义在类的` prototype ` 属性上面。
5671
5772``` javascript
@@ -131,7 +146,7 @@ Object.getOwnPropertyNames(Point.prototype)
131146上面代码中,` toString ` 方法是` Point ` 类内部定义的方法,它是不可枚举的。这一点与ES5的行为不一致。
132147
133148``` javascript
134- var Point = function (x , y ){
149+ var Point = function (x , y ) {
135150 // ...
136151};
137152
@@ -162,7 +177,7 @@ class Square{
162177}
163178```
164179
165- 上面代码中,Square类的方法名getArea ,是从表达式得到的。
180+ 上面代码中,` Square ` 类的方法名 ` getArea ` ,是从表达式得到的。
166181
167182### constructor方法
168183
@@ -187,6 +202,19 @@ new Foo() instanceof Foo
187202
188203上面代码中,` constructor ` 函数返回一个全新的对象,结果导致实例对象不是` Foo ` 类的实例。
189204
205+ 类的构造函数,不使用` new ` 是没法调用的,会报错。这是它跟普通构造函数的一个主要区别,后者不用` new ` 也可以执行。
206+
207+ ``` javascript
208+ class Foo {
209+ constructor () {
210+ return Object .create (null );
211+ }
212+ }
213+
214+ Foo ()
215+ // TypeError: Class constructor Foo cannot be invoked without 'new'
216+ ```
217+
190218### 类的实例对象
191219
192220生成类的实例对象的写法,与ES5完全一样,也是使用` new ` 命令。如果忘记加上` new ` ,像函数那样调用` Class ` ,将会报错。
0 commit comments