关于类和对象
如何理解类与对象
类:抽取公共属性和行为封装成一个类(模板),泛化的、抽象的
对象:对类进行实例化,一个具体的对象,具体的、特指的
类和对象的区别是什么呢?举两栗子:
栗子一:
A:其实养二哈挺好的,就是有点废家。
B:确实确实,我家都快被我那只二哈拆完了。
栗子二:
A:最近想买手机了,你觉得华为mate40pro怎么样?
B:我现在用的这部就是华为mate40pro,我觉得挺好用的,推荐。
上面两段对话中,A说的“二哈”和“华为mate40pro”就是类,B回答的“我那只二哈”和“我现在用的这部华为mate40pro”就是具体的对象,是一个具体的事物。
类就是一个抽象的概念,而对象就是这个抽象概念的一个具体事物,人类就是类,你、我、他、张三、李四、王五都是人类的具体对象。
对象
现实生活中,万物皆对象;JavaScript中对象是一组无序的相关属性和方法的集合,例如字符串、数组、函数等。
对象的组成:
- 属性:事物的特征,例如手机的型号、屏幕尺寸、处理器、厚度等
- 方法:食物的行为,例如手机可以打电话、发短信、拍照等功能
类
类抽取了对象的公共部分,用class来声明一个类,之后用来实例化一个个对象。
创建类和对象
// 创建类用class关键字创建,类名要大写(规范)
class Star {
// 类中的constructor函数接受传递过来的参数,然后返回给实例对象
// 如果不创建constructor函数,类也会自动创建该函数的。
constructor(name, age) {
this.name = name;
this.age = age;
}
}
// 用new生成实例对象,new之后会自动调用constructor函数
let pyy = new Star('彭于晏', 18);
let wyz = new Star('吴彦祖', 20);
console.log(pyy); // Star {name: "彭于晏", age: 18}
console.log(wyz); // Star {name: "吴彦祖", age: 20}
以对象pyy来说,当new出实例对象以后,就自动调用constructor函数,将实参(‘彭于晏’, 18)传入给constructor函数的形参(name, age),形参又赋给该对象(pyy)的属性,于是pyy对象就有相应的属性。
添加类方法
class Star {
constructor(name, age) {
this.name = name;
this.age = age;
}
// 直接在类中添加方法
// 多个方法之间不需要逗号,也不需要function关键字
coding(language) {
console.log(`我爱码${language}代码`);
}
}
let pyy = new Star('彭于晏', 18);
let wyz = new Star('吴彦祖', 20);
pyy.coding('javascript'); // 我爱码javascript代码
wyz.coding('php'); // 我爱码php代码
类的继承
属性继承
class Father {
constructor(x, y) {
this.x = x;
this.y = y;
}
sum() {
return this.x + this.y;
}
}
// extends关键字继承父类
class Son extends Father {
constructor(x, y) {
// super关键字调用父类构造函数
super(x, y);
}
}
let son = new Son(4156, 9617);
console.log(son.sum()); // 13773
当用new关键字创建Son的实例对象时,就调用了子类的constructor函数,并将实参(4156,9617)传入constructor形参中,此时x = 4156,y = 9617,再将两个参数传入super的形参中,此时super的x = 4156,super的y = 9617,使用super关键字时就会调用父类的constructor构造函数,把2个参数传入,此时父类的构造函数就得到了子类实例的2个实参,并进行相加。
方法继承
如果实例对象调用一个方法,先找自己身上有没有该方法,如果没有就去父类找,自身有则直接调用。(就近原则)
class Father {
say() {
console.log('我是你爸爸');
}
}
class Son extends Father {
say() {
console.log('我是你崽子');
// 用super关键字调用父类的方法。
super.say();
}
}
let son = new Son();
son.say(); // 我是你爸爸
son.earn(); // 我要赚钱
class Father {
constructor(x, y) {
this.x = x;
this.y = y;
}
sum() {
return this.x + this.y;
}
}
class Son extends Father {
constructor(x, y) {
// 如果父亲和儿子都有参数需要调用,super需要放在this之前
// (必须先调用父亲的构造函数,再使用子类构造函数)
super(x, y);
this.x = x;
this.y = y;
}
sub(x, y) {
console.log(this.x - this.y);
}
}
let son = new Son(4156, 9617);
console.log(son.sum()); // 13773
son.sub(); // -5461