JS之面向对象

关于类和对象

如何理解类与对象

类:抽取公共属性和行为封装成一个类(模板),泛化的、抽象的
对象:对类进行实例化,一个具体的对象,具体的、特指的

类和对象的区别是什么呢?举两栗子:

栗子一:
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值