面向对象

97 阅读3分钟
  1. 创建对象的四种方式
    • 字面量创建
    let o1 = {
        name:'rose'
        age:20
        gender:'女'
    }
    
    • 内置构造函数创建
    let o1 = new Object()
    o1.name = 'rose'
    o1.age = 20
    
    • 工厂函数创建对象:先自己做一个工厂函数,使用自己做的工厂函数来创建对象
    function createObj(name,age,gender){//创建一个工厂函数
        let obj = {}//手动创建一个对象
        //手动添加成员
        obj.name = name
        obj.age = age
        0bj.gender = gender
        return obj//手动返回这个对象
    } 
    
    • 自定义构造函数创建
    function createObj(){
        //自己书写一个构造函数
        function createObj(name,age,gender){}
        //自动创建一个对象
        //手动向对象上添加内容
        this.name = name
        this.age = age
        this.gender = gender
        
        //自动返回这个对象
        let o1 = neww createObj('jack',18,'女')
    }
    
  2. 构造函数的书写和使用
    • 构造函数也是函数,只不过在调用的时候和new 关键字连用了
    • 调用必须有new 关键字,如果没有,那么没有创建对象的能力。只要有,就会自动创建一个对象
    • 在构造函数内部不要写return,如果return 基本数据类型,写了白写,如果return复杂数据类型,构造函数白写
    • 构造函数在调用的时候,如果不需要传递参数,最后的小括号可以不写,但是推荐都写上
    • 构造函数推荐首字母大写是为了直接观看与普通函数的区别,看到首字母大写的函数,基本上就要和new连用
    • 当函数和new连用会创建对象,我们管创造出来的对象叫做实例对象,创造函数的过程叫做实例化过程,构造函数体内的this指向当前实例对象,也就是本次new的时候创建的那个对象
  3. prototype(原型/原型对象)
    • 每一个函数天生自带一个属性叫做prototype,他是一个对象,只要函数定义好以后,这个prototype就有了,构造函数也是函数,构造函数也有prototype,可以向里面添加一些内容
    • prototype 里面有一个属性叫做constructor,表示是那个构造函数半生的属性
    • prototype作用就是为了书写一些方法给该构造函数的实例对象使用,因为这个构造函数的每一个构造函数都可以访问
    • ———proto—— 每一个对象天生自带一个属性,叫做——proto——,指向所属构造函数的prototype
    • 实例化对象也是一个对象,实例化对象也有——proto——属性
  4. 对象访问机制
    • 当访问一个对象成员的时候,如果对象本身有,直接返回结果给你,停止查询,如果对象自己本身没有,会自动去——proto——上访问,有就给你返回结果,停止查询,如果还没有继续向上查询
  5. 原型链
    • 从任何一个对象出发,按照——proto——串联起来的对象链状结构,为了对象访问机制而存在
    数组.__proto__ ===  Array.prototype
    Array.prototype._proto_ === Objeck.prototype
    数组._proto_._proto_ === Objeck.prototype
    
  6. 判断数据类型
    • 1.typeof : 准确的判断基本数据类型,对于复杂数据类型不准确(对象,数组,函数)
    • 2.constructor : 利用原型的属性,利用对象访问机制,不能验证undefind和null
      1. instanceof : 语法: 对象 instanceof 构造函数 不能验证基本数据类型
    • 4.Objeck.porototype.tostring.call(要检测的数据类型)
  7. 数据劫持
      1. hasOwnProperty
      • 查看是不是自己的属性 语法 : 对象.hasOwnProperty('你要检测的属性名')
      1. defineProperty() 数据劫持
      • 一种给对象添加属性的方法,可以给一个设置好的属性设置各种各样的属性
      • 语法: Objeck.definProperty(给哪一个对象添加,{添加的设置})