面向对象复习

111 阅读3分钟

new

  • new的特点:1.new执行函数 2.自动创建空对象; 3.this绑定到空对象;4 隐式返还this; 通过new改造工厂模式
// 工厂模式
 function Person(name,age){
     // let obj = {} === this
     this.name = name
     this.age = age
     // return obj 
 }
 let zs = new Person('张三',18)
 console.log(zs); //Person {name: '张三', age: 18}

prototype原型

公共空间

  • 通过new实例化出来的对象其属性和行为来自两个部分,一部分来自构造函数,另一部分来自原型。
  • 当声明一个函数的时候,同时也申明了一个原型 。
  • 原型本身是一个对象。 构造函数实例化之后:

prototype.png

原型、构造函数及对象三者关系

  • this都指向实例化后的对象
  • constrector 可以用来判断对象是由哪个构造函数构造的 三者关系.png

原型链

对象之间的继承关系,在JavaScript中是通过prototype对象指向父类对象,直到指向Object对象为止,这样就形成了一个原型指向的链条,称之为原型链;

1.当访问一个对象的属性或方法时,会先在对象自身上查找属性或方法是否存在,如果存在就使用对象自身的属性或方法。如果不存在就去创建对象的构造函数的原型对象中查找 ,依此类推,直到找到为止。如果到顶层对象中还找不到,则返回 undefined。

2.原型链最顶层为 Object 构造函数的 prototype 原型对象,给 Object.prototype 添加属性或方法可以被除 null 和 undefined 之外的所有数据类型对象使用。

原型链.png

继承

在学习继承之前,需要先掌握call,bind ,apply,这三个方法都是可以指定this

  • fn.call(this,参数1,参数2)
  • fn.apply(this,[参数1,参数2])
  • fn.bind(this)(参数1,参数2)

构造函数继承

  • 继承:子类继承父类所有属性和行为,父类不受影响。
  • 目的:找到类之间的共性精简代码
function Person(name){
    this.name = name;
    this.eyes = "两只";
    this.legs = "两条";
}
function Student(name){
    Person.call(this,name)
    this.className = "二班";
}
let newPerson = new Student("张三");
console.log(newPerson.className);
  • 简单原型继承,出现影响父类的情况;

    function Person(name){
        this.name = name;
        this.eyes = "两只";
        this.legs = "两条";
    }
    function Student(name){
        Person.call(this,name)
        this.className = "二班";
    }
    Student.prototype = Person.prototype  //直接赋值
    

原型的深拷贝继承

  • 传值和传址问题

    • 基本数据类型:Number、String、Boolean、Null、Undefined
    • 复杂数据类型/引用数据类型:Array、Date、Math、RegExp、Object、Function等
  • JOSN序列化的不足

    如果拷贝对象包含函数,或者undefined等值,此方法就会出现问题
    
  • 浅拷贝和深拷贝

    //递归深拷贝
    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;
    }
    

###原型的继承

  • 深拷贝继承

  • 组合继承

    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
    • 包装对象把所有的属性和方法给了基本类型,然后包装对象消失