JavaScript | 教你如何理解面向对象(二)

95 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

前言

通过第一篇浅谈了面向对象的概念和对象的详解之后,今天再继续了解通过面向对象是如何去实现代码的。

需要了解的一些属性和方法概念

1.公有属性和方法

设置给实例化对象的属性和方法,被称作为公有属性和公有方法,可直接调用使用

2.私有属性和私有方法

在构造函数中声明的属性和方法,被称作为私有属性和私有方法,不可直接调用使用

3.静态属性和静态方法

直接给构造函数对象扩展的属性和方法,无须实例化就能使用的 被称为静态属性和静态方法

4.特权方法

在构造函数中给实例化对象扩展的方法,被称作为特权方法

5.私有方法和特权方法的区别

特权方法是指有权访问内部私有属性和私有方法的公有方法,而私有方法是指外部不可见且不可访问的方法

通过一个demo示例一下这些方法的用处

模拟一个私人医生

function person (cure){
  //医生具备公有的治疗属性  公有属性
  this.cure = cure
  
  //私人医生具有个人方案   私有属性
  var plan = '个人方案'
  
  //私有方法
  function fn(){
    console.log('这配方只给你用')
  }
  
  //特权方法
  this.vip = function(){
    console.log('对你实行具体计划安排')
  }
}

//公有方法
person.prototype.do = function(){
  console.log('会诊断')
}

//静态方法
person.say = function(){
  console.log('我医术高明')
}
var result = person('aaa')

面向对象三大特性

不用多说,大家都知道,封装、继承、多态,那我就再详细的说说吧

封装

封装就是将信息隐藏,内部对外部隐藏。分为封装数据和封装实现

  • 封装数据:JS中依靠作用域来封装数据
  • 封装实现就是隐藏细节,隐藏行为,让内部的行为对外不可见。降低耦合,使用户不需要考虑实现,只需要通过API接口调用即可

多态

同一个操作作用在不同的对象上边,产生不同的结果,被称作为多态

    // Cat 构造函数
    function Cat(){}
    Cat.prototype.eat = function(){
       console.log('猫粮')
    }
    var cat = new Cat()
    
    //Dog 构造函数
    function Dog(){}
    Dog.prototype.eat = function(){
       console.log('狗粮')
  }
  var dog = new Dog()
  
    //封装一个指令
    function goToEat(obj) {
        obj.eat();
    }
  //同一个指令作用在不同的对象上
    goToEat(cat);
    goToEat(dog);

继承

当一个对象可以使用另外一个对象的属性和方法的时候,称作为继承

构造函数+原型 组合继承

 //父类
function Animal(name, sex) {
    this.name = name;
    this.sex = sex;
}
Animal.prototype.speak = function () {
        console.log("喵呜")
}
//子类
function Cat(type, name, sex) {
/*
构造函数继承:
让父类构造函数中的this指向子类构造函数的this,
子类构造函数的实例化对象就拥有了父类和子类的属性
*/
Animal.call(this, name, sex)
this.type = type;
} 
/*
原型继承:
不能直接把父类的原型对象赋值给子类的原型对象,
因为赋值是地址值的赋值,修改子类,父类也会被修改
比如Cat.prototype = Animal.prototype;
*/
Cat.prototype = new Animal();
//原型继承后要修正原型链
Cat.prototype.constructor = Cat;
console.log(Cat.prototype.constructor === Cat) //true

Cat.prototype.do = function () {
    console.log("给你一爪子");
}

var cat = new Cat("银渐层", "月月", '母');
console.log(cat.name); //月月
console.log(cat.speak); // f(){console.log("喵呜")}

var animal = new Animal();
console.log(animal);

好了,以上就是本篇文章的分享,感谢阅读!