zoukankan      html  css  js  c++  java
  • js面向对象

    • 什么事面向对象
      • 用对象的思想去写代码,就是面向对象编程
    • 面向对象编程(OOP)的特点
      • 抽象:抓住核心问题

      • 封装:只能通过对象来访问方法

      • 继承:从已有对象上继承出新的对象

      • 多态:多对象的不同形态

    • 对象的组成
      • 属性——对象下的变量
      • 方法——对象下的函数
      • this指向
        • 指的是该方法的调用对象
    • 工厂方式
      • 面向对象中的封装函数
      • 当new去调用一个函数:这个时候函数中的this指向该函数对象,并且会隐式返回该函数对象。(相当于新创造的对象,不依附于任何其它对象)
      • new后面的函数就叫做构造函数
      • !关于new与this的关系:实际上new后面调用的函数是一种特殊的函数叫做构造函数,用于创建一个对象,但是new的语法规定构造函数中的this就是将要创建的对象,因此直接用this指代对象而没有必要重新创建一个对象(var obj= new Object()),并且为了简化构造函数,语法中同时规定构造函数执行完会自动返回this,即自动返回创建出来的对象;所以说在构造函数中,this的使用节省了对象的创建,而new的使用节省了对象的返回;
    • 对象类型的引用
      • 基本类型(数字,字符,布尔值):赋值的时候是值得复制;
      • 对象类型:赋值操作实际上是引用的传递,多个对象公用一个地址;
      • 通过a=[];这种形式赋值那么必定会建立一个新地址。
      • 在构造函数中创建的对象方法每new出一个新的对象调用该方法都会在内存中生成一份新的方法,所以重复创建对象会使得构造函数中的对象方法重复被创建,占内存拖累性能。
    • 原型    
      • 将方法写到原型中而不是写到构造函数中,可以避免方法的重复创建。
      • 去改写对象下面公用的方法或者属性,让公用的方法或者属性在内存中只存在一份(提高性能)。
      • 原型要写在构造函数的后面,this指向该构造函数对象。
      • 优先级原型要低于普通写法。
      • 面向对象的改写原则
      • 先写出普通的写法,然后改成面向对象写法

        • 将局部变量改为全局变量

        • 尽量不要出现函数嵌套函数

        • 把onload中不是赋值的语句放到单独initial()函数中

      • 改成面向对象

        • 全局变量就是属性

        • 函数就是方法

        • Onload中创建对象

        • 改this指向问题

        • 事件函数中ev的处理
    • 基本类型都有自己的包装对象
      • String
      • Number
      • Boolean
      • 基本类型没有属性和方法,而是隐式调用了各自对应的包装对象,所以要给基本类型添加方法或者属性,要加在其包装对象上。
      • 当基本类型调用其对应的包装对象下的方法的时候,基本类型会找到对应的包装对象类型,然后包装对象吧所有的属性和方法给了基本类型,然后包装对象消失。
    • 原型链
      • 实例对象与原型之间的链接
      • _proto_ (隐式链接)
      • 最外层原型链:Object.prototype;(优先级从内向外,普通写法的优先级最高)

    面向对象的一些属性和方法

    • hasOwnProperty:看是不是对象自身下面的属性;此方法在最外层object.prototype.hasOwnProperty;
    • constructor:查看对象的构造函数;每一个函数都会自动生成的;fn.prototype.constructor=fn;
      • 原型的赋值如果用json的形式,需要手动加上constructor的指向,否则默认生成的constructor会被覆盖;
        • Aaa.prototype.name='xioaming';Aaa.prototype.age=20;//这种方法相当于添加属性;
        • Aaa.prototype={name:'xiaoming',age:20};//相当于赋值,原有的prototype会被覆盖,所以系统自动生成的constructo也会一并被覆盖;应该手动添加Aaa.prototype={constructor:Aaa,name:'xiaoming',age:20}
      • constructor系统自动添加的,for in循环不到,即使是手动添加constructor也不行;
      • arr.constructor==Array //判断数据类型(跨页面的情况下会失效,例如ifream中的类型判断)
      • instanceof : 运算符
        • 对象与构造函数是否在同一个原型链上。

          • arr instanceof Array //判断数据类型(跨页面的情况下会失效,例如ifream中的类型判断)
        • toString:改变数据类型,或者将数字变成任意进制。
          • alert(Object.prototype.toString.call(arr)=='[object,Array]'); //靠谱的判断对象类型的方法
          • arr.toString();//数组转成字符串;
          • num.toString(16);//数字转成任意进制;
          • 位置:系统对象自身的原型下都自带toString;自己写的对象是通过原型链找到object原型下的toString
    • 对象的继承
      • 在原有对象的基础上,略作修改,得到一个新的对象 不影响原有对象的功能
    • 如何添加继承
      • 属性的继承:调用父类的构造函数,通过 call 修改this指向。
      • 方法的继承:
        • 类式继承(一行代码的继承方式)直接将父类的原型对象赋给子类的原型对象。CreateStar.prototype=CreatePerson.prototype;(但这种方式会造成对象的引用,修改子类会改变父类,可以通过将属性与方法分开进行继承的方式进行继承)
        • 利用for in 进行拷贝继承。//靠谱的属性继承方式
          • 对象属性通过call方法直接拷贝到子对象上;
          • 原型上的方法通过for in循环拷贝到子对象的原型链上(函数比较特殊的一种对象,函数的赋值不是引用而是像基本类型一样直接在内存中复制了一份,所以不会因为赋值后的函数被修改影响到赋值前的函数)
          • 用到的函数extend()
          • function extend(obj1,obj2){
                for( attr in obj2 ){
                      obj1[attr] = obj2[attr];
                }
            }      
        • 原型继承
    • 组件的开发
      • 面向对象的深入应用(UI组件,功能组件)
      • 将配置参数,方法,事件,三者进行分离
      • 创建自定义事件
        • 有利于多人协作开发代码
        • 如何去挂载自定义事件与事件函数
  • 相关阅读:
    找到了2年前的一个微博小号
    Float Equal Problem
    有用的护肤品贴
    最近状态总结
    [Coursera]Machine Learning
    KMP算法(转载)
    [Leetcode] Median of Two Sorted Arrays
    [Algorithms(Princeton)] Week1
    [Algorithms(Princeton)] Week1
    [Leetcode] Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/yuxinpeng/p/5993504.html
Copyright © 2011-2022 走看看