bug收集:专门解决与收集bug的网站
网址:www.bugshouji.com
01
ECMAScript 5 中类的实现
大家都知道 ECMAScript 5 中是没有 class 这个概念的
但是 javascript 中还是可以使用面向对象的方式去编写代码的,因为面向对象是一种思想。ECMAScript 5 中使用原型对象来实现类似 class 的作用
代码如下:
代码语言:javascript复制function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype.toString = function () {
return '(' this.x ', ' this.y ')';
};
var p = new Point(1, 2);
上面这种写法跟传统的面向对象语言(比如 C 和 Java)差异很大,很容易让新学习这门语言的程序员感到困惑。
02
ECMAScript 6 中类的实现
ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过 class 关键字,可以定义类。
代码如下:
代码语言:javascript复制class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' this.x ', ' this.y ')';
}
}
constructor 方法,这就是构造方法,而 this 关键字则代表实例对象,实例的属性一般都在这里定义。
toString 方法,是类中定义的一个实例方法。注意:定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。
03
两者的关系
基本上,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已
ES6 的类,完全可以看作构造函数的另一种写法。
代码语言:javascript复制class Point {
// ...
}
typeof Point // "function"
Point === Point.prototype.constructor // true
上面代码表明,类的数据类型就是函数,类本身就指向构造函数。
04
ECMAScript 6 中类的说明
class 的使用
代码语言:javascript复制class Bar {
doStuff() {
console.log('stuff');
}
}
var b = new Bar();
b.doStuff() // "stuff"
类的 prototype 属性
事实上,类的所有方法都定义在类的prototype属性上面
代码语言:javascript复制class Point {
constructor() {
// ...
}
toString() {
// ...
}
toValue() {
// ...
}
}
// 等同于
Point.prototype = {
constructor() {},
toString() {},
toValue() {},
};
在类的实例上面调用方法,其实就是调用原型上的方法。
代码语言:javascript复制class B {}
let b = new B();
b.constructor === B.prototype.constructor // true
本文,参考阮一峰的文章,地址如下:
https://es6.ruanyifeng.com/#docs/class