js之面向对象

时间:2023-03-10 00:29:46
js之面向对象

本文的面向对象分为ES6和ES6之前的,重点学习ES6的
===============================
一、面向对象
1、什么是面向对象
  a)什么是对象:万物都可以抽象成对象
    时间对象
    var oDate=new Date();(我们经常var的oDate就是一个时间对象)
    oDate.getFullYear();(新建的oDate就继承了Date里面的所有方法)
    数组
    var arr=new Array();
    arr.sort();
    arr.length;
    json{
      name:'aa',
      showName:function(){
        alert(1);
      }
    }
    json.name;(json对象的属性)
    json.showName();(json对象的方法)
  b)面向对象是一种思想:
    我们只关心怎么去用,不关心里面是怎么实现的
    提高了效率

2、怎么去面向对象
  a)先要有一个对象
    对象都有特征,都有属性和方法

    属性 属性就是变量,只不过他有依附关系
    特征 变量 *的,独立的

    方法 就是函数,只不过他有依附关系

    函数 独立的

  b)造对象
    1、var arr=[];
    批量造对象

  c)构造函数:用来造对象的函数,构造函数也是函数,只是因为用途而得名,为了和普通函数做区别,首字母大写就是构造函数

  d)this 想要学好面向对象 必须知道this指向谁
    new是干什么的
    1、会在构造函数开始的位置创建一个空对象(并且把this指向空对象);
    2、自动返回空对象

  e)属性不同的,方法是相同的
    是ES6之前面向对象的核心:原型

  f)面向对象怎么写: 构造原型混合模式
    1、构造身上加属性
    2、原型身上加方法 prototype

      function Person(name,age){
        //添加属性和方法
        this.name=name;
        this.age=age;
      }
      Person.prototype.showName=function(){
        alert('我是舞王'+this.name);
      };

      g)prototype 也是对象
        1、写面向对象是为了扩展系统方法

      h)arr.indexOf()

        练习题:
          时间对象里面 getDay 0-6 0星期天
          getCnDay 星期一 --- 星期日

-----------------------------------
二、总结:
  1.什么是对象:
    一切都是对象
  2.什么是面向对象:
    只关心怎么调用,不关心怎么实现的
  3.怎么写一个类 就是一个构造函数
    属性加在构造身上
    方法加在原型身上

    function Person(...){
      this.XX=XXX //加属性
    }
    Person.prototype.XXX=function(){}; //加方法
  4.怎么去造一个对象
    new 类名()
    eg var barry=new Person();(barry获得person的属性和方法)
  5.new 都干了什么
    1)、造一个空对象,并把this指向对象
    2)、返回这个对象
  6.prototype原型:
    1)、可以写面向对象
    2)、可以扩展系统的方法
  7.原型和原型链的区别
    原型prototype 就是一个对象,存在于每个对象身上
    原型链:就是因为有prototype的存在,js产生了原型链
  8.ECMAScript 里面的方法都是用原型写的

    类 在js里面类就是构造函数
    实例 构造函数调用完返回的对象

  9.面向对象--一种思想

  10.面向对象的特征:
    封装 抽象了事物的核心
    多态 一个事物可以继承多个亲属的特征
    继承 事物得到了父亲的一些特征
-----------------------------------
11.object
  instanceof 检测一个物体的血缘关系
    子级 instanceof 父级 返回true false
  constructor 物体是由那个构造器诞生的
    子级.constructor==父级 返回true false

  包装类(是java里面的)
  简写的数据类型object不认。
12.this 有优先级 从上到下,优先级变小
  new object
  定时器 window
  事件 触发事件的对象
  对象 对象
  show() window
13.继承 子级继承父级的功能
  给父级一个功能,子级默认就有

  玩继承:
  属性
  在子级的构造中,调用父级的构造
  function 子级(name,age){
    //父级.call(this,name,age);
    父级.apply(this,arguments);
  }
  方法
  1、son.prototype=father.prototype;
    问题:子级改了父级也改变
  2、for(var name in father.prototype){
    son.prototype[name]=father.prototype[name];
  }
    问题:孩子不认爷爷
  3、 子级.prototype=new 父级();
    问题:子级的孩子不认子级
  终极版:子级.prototype.constructor=子级;
-----------------------------------------------
三、ES6
  1.对象
    let name='张三';
    let json={
      name,
      showName(){
        alert(this.name)
      }
    }
  2.面向对象
  class Person{ //类
    constructor(name,age){ //构造 属性加在构造身上
      this.name=name;
      this.age=age;
    }

    showName(){
      alert(this.name);
    }

    showAge(){
      alert(this.age);
    }
  }
  3.继承
    class Student extends Person{
      constructor(name,age,job){
        super(name,age);//super在这里就是向上越级继承父级的属性
        this.job=job;本身又加的属性
      }

      showJob(){
        alert(this.job);
      }
    }

-------------------------------------------------

ES6之前构造函数里子级继承父级的属性
  函数名.call(this的指向,参数。。。。)针对多个参数的情况,不确定数量
  函数名.apply(this的指向,[参数,参数。。。。]);

------------------
对象引用
js为了节省空间,采取的一种行为;
var arr=[1,2,3];
var arr2=arr;
------------------
for-in 通过对象的属性进行循环
用来循环对象的。但是能用for循环就不用for-in

for var i=0;i<10;i++
-------------------

json{

"a":"1",

"b":"2",

"c":"3"

}

for(var v in json){

  console.log(v);//打印出1,2,3

 }