JavaScript学习笔记---面向对象

##  面向对象   面向过程     类

## 对象 【键值对,属性名,属性值】

## 创建对象

## 1.字面量创建对象 根据特征

    var obj = {
        name:'aa',
        fn:function(){}
    }
    console.log(obj.name);
    obj.fn();
    
    缺点: 不适合创建大量对象,会造成代码冗余

## 2.实例创建对象 根据关键字 

    var obj = new Object();  ==> 相当于  var obj = {}
    obj.属性名 = 属性值;
    obj.方法名 = function(){}
    
    缺点: 不适合创建大量对象,会造成代码冗余

## 3.工厂模式 【封装实例创建方法,并且记得return】

    function 函数名(a){
        var obj = new Object();     准备原材料
        obj.属性名 = a;             加工
        obj.方法名 = function(){}

        return obj;                 推出工厂,走向世界
    }

    instancof检测来源
    console.log(n1 instanceof 工厂模式函数名);    false
    console.log(n1 instanceof Object);            true

    缺点: 用instanceof检测发现无法识别具体来源

## 4.构造函数式创建对象

     构造函数特点:
        1.函数名首字母大写【不是必须,是约定】
        2.this来赋值         【重点】
        3.实例化时需要加new  【重点之重点】
        4.用this赋值时,无需return

        function Abc(a,num){   // 函数名首字母大写
            this.name = a;     // 用this赋值
            this.age = num;
            this.fn = function(){

            }
        }
        var n1 = new Abc('Alice',19);    // 实例化构造函数时 加 new  ************
        console.log(n1 instanceof Abc);  // true  可以识别来源

        缺点: 实例化对象时,会重新创建该对象中的方法,造成内存浪费

## 5.原型创建对象

    原型:prototype  【只有函数有】
    属性:__proto__  【大范畴对象都有】

    原型链:一种指向关系。该对象的__proto__属性,指向了它的构造函数的原型。最终指向指向空(null)。
        
        function Fn(a){  // 构造函数
            this.name = a;
            
        }
        // 在构造函数的原型上添加属性和方法,并且他们是共享的。
        Fn.prototype.age = 10;
        Fn.prototype.fun = function(){
            console.log(11111)
        }
        var s1 = new Fn('Ann');  // {}
        var s2 = new Fn('Bob');

        console.log(s1.fun == s2.fun);  // true

    注: 构造函数prototype【原型】上的属性和方法是共享的。

    缺点: 不能传参

## 混合开发 【构造函数+原型创建】

    构造函数 中 放私有
    原型方法 中 放公共

## 改变this指向  功能完全一致,传参方式不同

    1.call

    函数名.call(新指向,实参1,实参2......)

    2.apply

    函数名.apply(新指向,[参数1,参数2])

    3.bind

    var 变量名 = 函数名.bind(新指向,参数1,参数2......)
    变量名();

## 面向对象继承

    1.原型链继承  

      单向   【构造函数体内的私有方法和 构造函数原型上的公共方法 都能被继承】
        function A(){}

        function B(){}   

    2.对象冒充继承 

      单向  【只能继承构造函数上的私有方法 不能继承 该构造函数 原型上的属性和方法】

 

原文地址:https://www.cnblogs.com/shihaiying/p/13276172.html