面向对象基础

面向对象(OOP:Object Oriented Programming)

概要

  • 理解面相对象思想
  • 会使用工厂模式
  • 会使用new运算符
  • 会使用构造函数
  • 理解原型
  • 理解原型链
  • 会使用继承
  • 理解类和对象
  • 包装对象

面向对象编程思想

一、面相过程:注重解决问题的步骤,分析问题需要的每一步,实现函数依次调用;

二、面相对象:是一种程序设计思想。将数据和处理数据的程序封装到对象中;

三、面相对象特性: 抽象、 继承、封装、多态

优点:提高代码的复用性及可维护性;

Javascript 是一种基于对象的语言,几乎所有东西都是对象;

对象创建方法:

  • 字面量创建

  • new Object()创建

  • Object.create()创建:创建对象的原型;

工厂模式

一、工厂模式---提高代码复用性;
方法(){原料,加工,出厂}

new运算符

  • new的特点:1.new执行函数 2.自动创建空对象; 3.this绑定到空对象;4 隐式返还this;5.
  • 通过new来改造工厂模式

构造函数

  • 构造函数首字母大写
  • this指向实例化对象
  • 静态属性及方法属于类
  • 静态方法里的this;

工厂模式对比构造函数/特点

  • A.prototype原型:公共空间存放公共方法(节约内存 ##构造函数提升性能
  • 对象识别:a.consturctor=>A 由A构造a

prototype原型

  • 对象其属性和方法来自两个部分-构造函数+原型(追加)
  • 原型本身是一个对象,是一个公共空间,存放公共方法(节约内存。

原型构造函数及对象关系

  • 对象其属性和方法来自两个部分-构造函数+原型(追加)。构造函数 通过new实例化 对象;a.proto== A.prototype

  • 构造函数A.prototype=>原型;原型的固有属性constructor指向构造函数 A.prototype.constructor == A; a.consructor == A

  • 应用:判断实例化对象的类型"a".constructor===String

原型链

  • 对象之间的继承关系,通过prototype原型对象指向父类对象,直到指向null为止,这样就形成了一个原型指向的链条,称之为原型链;
  • 查找对象的属性或方法时,就近:先在对象自身上查找,如果不存在就去原型链中查找 ,直到找到为止。如果还找不到返回 undefined。

继承

  • 继承:子类继承父类所有属性和行为,父类不受影响。
  • 目的:找到类之间的共性精简代码
  • 方式:
  1. 构造函数继承-内部-call,apply([数组形式的参数]),bind(返回一个函数,不会立即执行。())

  2. 原型链继承-外部-B.prototype==new A()
    深拷贝继承-

    • 传值和传址问题
      基本数据类型:Number、String、Boolean、Null、Undefined传值
      复杂数据类型/引用数据类型:Array、Date、Math、RegExp、Object、Function等传址,互相影响--》解决深拷贝
    • 深拷贝方式:
    1.JSON序列化
             json.parse(json.stringfy(obj))
             不足:丢失拷贝对象的函数、undefined等值
    
    2.封装深拷贝函数
                               function deepCopy(obj){
    			      let newObj = Array.isArray(obj)?[]:{};
    			      for(let key in obj){
    			          if(obj.hasOwnProperty(key)){
    			                if(typeof obj[key] == "object"){
                  				   newObj[key] = deepCopy(obj[key]);
              					}else{
    			                   newObj[key] = obj[key];
    				  return newObj;
    
    3. 组合继承-
    function Dad(){
        this.name = "张三";
    }
    Dad.prototype.hobby = function(){
        console.log("喜欢篮球");
    }
    function Son(){
        Dad.call(this);
    }
    let F = function(){}
    F.prototype = Dad.prototype;
    Son.prototype = new F();
    Son.prototype.constructor = Son; 
    let newSon = new Son();
    newSon.hobby();
    

包装对象

  • 除过null,undefined,基本类型都有自己对应的包装对象:String Number Boolean
  • 包装对象把所有的属性和方法给了基本类型,然后包装对象消失
上一篇:js 构造函数和原型、原型链


下一篇:面试精讲(guigu)