面向对象(Object Oriented Programming)

本文深入解析JavaScript面向对象编程,涵盖面向过程与面向对象的区别,类的定义与使用,包括构造函数、方法添加、继承机制及super关键字的运用,帮助读者掌握面向对象核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

js之面向对象的程序设计

认识面向过程(POP)

面向过程就是分析出解决问题需要的步骤,用步骤来实现,举个栗子:把大象放进冰箱需要三步。就是我们已经分析好了步骤,按照步骤来解决问题。

面向对象(Object Oriented Programming)

面向对象就是把事物分解成为对象,然后由对象之间进行合作和分工。找出对象写出对象的功能。
举个栗子:①对象:大象;功能:进去
②对象:冰箱;功能:打开关闭;
即oop是以对象功能的划分来解决问题的。

特点

  • 封装性
  • 继承性
  • 多态性
  • 容易维护,复用,扩展,性能比面向过程低

思维特点

  • 抽取对象共用的属性和行为来封装成一个类(模板);(手机)
  • 对类进行实例化,获取类的对象;(华为)

对象

在js中,对象是一组无序的相关属性的方法和集合,所有的事物都是对象,例如字符串,数值,数组,函数等等;

  • 属性:对象的特征
  • 方法:对象的行为

class

类抽象了对象的公共部分,它泛指某一大类,对象特指某一个,通过类实例化一个具体的对象

①面向对象的思维特点

  • 抽取对象共用的属性和行为组织封装成一个类(模板);
  • 对象进行实例化,获取类的对象
class Star{
  constructor(uname){
       this.uname=uname;
       this.age=age;
       }
 }

var xnn=new.Star('小楠楠',18);
console.log(xnn.uame);

当我用new创建了这个实例之后,自动调用了constructor,函数就会执行,’小楠楠‘就会传递给uname,再传递给this.name就是说创建的这个实例已经具有uname的属性了。

注意点
  • 关于class,习惯性定义首字母大写;
  • 类中有constructor函数,可以接受传递过来的参数,同时返回实例对象;它也会返回。
  • constructor函数只要new生成实例的时候就会自动调用这个函数
  • new不能省略,生成实例;
  • 注意语法,类后面加{},实例后面加(),构造函数不需要加function

②在类中添加方法

class Star{
  constructor(uname){
       this.uname=uname;
       this.age=age;
       }
       sing(song){
           console.log(“我唱歌”);
           console.log(this.uname+song);
 }

var xnn=new.Star('小楠楠',18);
console.log(xnn.uame);
xnn.sing('我和我的祖国’);
注意
  • ①类中所有的函数都不需要写function;
  • ②多个函数之间不需要加逗号分隔;
  • ③方法也可以传递参数;

③类的继承

①父慈子孝继承财产

class Father{
     constructor(){
     }
     money(){
     soncle.log(100);
     }
}
class Son extends Father{
}
var son=new Son();
son.money();//100

用extends就可以教程父类的属性和方法

②父慈子孝教你做加法

class Father{
    constructor(x,y){
         this.x=x;
         this.y=y;
     }
     sum(){
           console.log(this.x+this.y);
           }
     }
class Son extends Father{
      constructor(x,y){
          super(x,y);//这里调用了父类中的构造函数
          }
}
var son=new Son(1,2);
son.sum();

先new实例化了,把(1,2)传递给子类中的constructor,接着再执行了super,super把(1,2)传给父类中的constructor,而父类中的方法就可以使用这两个数据了。
关键字super可以调用父类中的constructor
除了调用构造函数,也可以调用普通函数

③我永远是你爸爸,带孝子也要自省

class Father{
    say(){
         return'我是你爸爸‘;
         }
     }
 class Son extends Father{
     say(){
           console.log(’我是儿子‘);
           }
      }
var son =new Son();
son.say();//我是儿子

注意:

  • 继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就执行子类的,简称“就近原则”
  • 继承中,如果子类里面没有,就去查找父亲有没有这个方法,如果有,再执行父亲的。
  • 继承中的属性方法查找原则:就近。
super也可调用父类普通函数
class Son extends Father{
     say(){
           console.log(’不可能‘+super.say());
           }
      }
var son=new Son();
son.say();//不可能我是你爸爸(这里就是调用了父类的普通函数)

④带孝子可以创新,但应该先继承

要永远把父亲放在第一位
class Father{
     constructor(x,y){
         this.x=x;
         this.y=y;
     }
     sum(){
           console.log(this.x+this.y);
           }
     }
//子类继承父亲的加法同时扩展减法
class Son extends Father{
      constructor(x,y);
      //**利用super调用父类的构造函数,但super必须在this之前调用**
      super(x,y);
      this.x=x;
      this.y=y;
   }
   subtract(){
       console.log(this.x-this.y);
       }
    }
    var son=new Son(5,3);
    son.subtract();
    son.sum();

使用类注意事项

class Star{
    this.uname=uname;
    this.age=age;
    this.sing();//这里的this不能省略
    }
    sing(){
        console.log(this.uname);//这里的this不能省略
        }
    }
    var xnn=new Star('小楠楠’);

``

注意事项
  • ①莫得变量提升,所以必须先定义类,才能通过类实例化对象
  • ②类里面的共有的属性和方法****一定要加this使用

##关于this里面的指向

  class Star{
     constructor(uname,age){//constructor里面的this指向的是创建实例的对象
      this.uname=uname;
      this.age=age;
      this.sing();
      }
      sing(){
          console.log(this.uname);
          }
      dance(){
          console.log(this);
          }
             
      }
      var xnn=new Star('小楠楠’);
      xnn.dance();//这里是xnn调用了函数,this就是指向xnn
      

还有一种方法,先定义一个全局变量,在constructor里面把this保存在这个全局变量里面,这样在任何一个地方都可以使用全局变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值