ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
#### 类的由来 `Javascript`中,生成实例对象的方法是通过构造函数,这种方式与传统的面向对象语言(比如c++,java)差异很大,`ECMAScript 6`提供了更接近于传统面向对象的写法,引入了`Class`类的概念,作为对象的模板。通过`Class`关键字来定义类 #### 什么是类? `Class`类是在Js中编写构造函数的另一种方式,本质上它就是使用构造函数的**语法糖**,在底层中使用仍然是原型和基`于原型的继承。 ~~~ // Es 5 function Person(name, age, job){ this.name = name this.age = age this.job = job } Person.prototype.getPerson = function(){ return name + '|' + age + '|' + job } // Es 6 class Person { constructor(name, age, job){ this.name = name this.age = age this.job = job } getPerson(){ return this.name + '|' + this.age + '|' + this.job } } var person = new Person('chicago',22,'student') person.getPerson() // chicago|22|student ~~~ * 构造函数的prototype属性,在`Class`类中继续存在,实际上,类的所有方法都定义在类的prototype属性上 ~~~ class Person { constructor(name, age, job){ this.name = name this.age = age this.job = job } getPerson(){ return this.name + '|' + this.age + '|' + this.job } } console.log(Person.prototype) // {constructor: ƒ, getPerson: ƒ} ~~~ * 在类的实例上调用方法,实际上也是调用原型上的方法 ~~~ class A{ // ... } let a = new A() console.log(a.constructor === A.prototype.constructor) // 这其实很好理解,a实例上并没有constructor属性,所以会通过原型链向上查找属性,最后在A类中找到constructor ~~~ * 类的内部所有定义的方法,都是不可枚举的(non-enumerable) ~~~ class Point{ constructor(x,y){ // ... } toString(){ // ... } } Object.keys(Point.prototype) // [] 这里toString方法是Point类内部定义的方法,是不可枚举的 Object.getOwnPropertyNames(Point.prototype) // ["constructor","toString"] ~~~