A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

JS中的面向对象,在es6中有class类后,变得更容易理解了,虽然这个class只是JS原型思想构造函数的语法糖,但无疑让习惯了面向对象编程的开发者找到熟悉的套路。

JS中的构造函数:

function People(name, age){
    this.name = name;
    this.age = age;
}
People.prototype.eat = function(){
    console.log([this.name, 'eat somthine'].join(' '))
}
People.prototype.speak = function(){
    console.log('My name is '+this.name+', age '+this.age)
}
1
2
3
4
5
6
7
8
9
10
将构造函数改写成类时的写法,类作为对象的模板:

//People类
class People {
    constructor(name, age){
        this.name = name;
        this.age = age;
    }

    eat(){
        console.log(`${this.name} eat somthing.`);
    }

    speak(){
        console.log(`My name is ${this.name}, age ${this.age}`);
    }
}

//类实例化
let nitx = new People('nitx', 30);
let sxm = new People('sxm', 31);

nitx.eat();
nitx.speak();

sxm.eat();
sxm.speak();

/*
打印:
nitx eat somthing.
My name is nitx, age 30
sxm eat somthing.
My name is sxm, age 31
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
上例People类中的constructor是构造方法,对应原来的构造函数,类的this和构造函数中的this一样代表实例对象。People类中的实例方法无需加上function关键字,直接定义函数名和函数体即可,方法之间不需要用逗号隔开。

typeof People;  //function
People === People.prototype.constructor;    //true
1
2
上例代码表明**类的数据就是函数,类本身就指向构造函数。**在类的实例上调用方法,其实就是调用原型上的方法。

由于类的实例方法都是定义在prototype属性上的,所以People类的实例方法也可以使用Object.assign方法来一次性添加多个实例方法。

class People {
  constructor(){
    // ...
  }
}
Object.assign(People.prototype, {
    eat(){
        console.log(`${this.name} eat somthing.`);
    },
    speak(){
        console.log(`My name is ${this.name}, age ${this.age}`);
    }
})
1
2
3
4
5
6
7
8
9
10
11
12
13
此外需要注意一点,**类中创建的实例方法都是不可枚举的,而构造函数创建的实例方法则是可枚举的,**这点需要注意。

还有几个注意点总结如下:

es6的class类和模块内部默认遵循严格模式。
class类默认就有constructor方法,即使在创建时没有在类中写有constructor,JS引擎也会自动添加。constructor默认返回实例对象,即this,也可手动更改返回的对象。
class类调用必须使用new关键字,否则会报语法错误。
与es5的构造函数一样,class类实例的属性除非显示定义在其本身(即this对象),否则都是定义在原型上的。
和es5构造函数一样,class类的所有实例共享同一个原型,所以当在某个实例对象上通过使用Object.getPrototypeOf获取该实例原型的方法来在原型上添加新的方法时,其他该类的实例对象也自动拥有新增的原型方法。
和函数一样,class类也可以用表达式来定义:命名类表达式和匿名类表达式。和命名函数表达式一样,这个命名只在类内部才能使用。而匿名类表达式和匿名函数表达式一样,可以写出立即执行的类,写法同立即执行匿名函数表达式。
class不存在变量提升这个机制。
---------------------
【转载,仅作分享,侵删】
作者: 一期一会
原文:https://blog.csdn.net/qq_34832846/article/details/86221343


1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马