面向对象的概念:

- 两种编程思路: 函数式(过程式)、面向对象(OOP)
- 类 : 具有相同的属性和方法的一类对象的抽象
- 实例 :某一类当中的一个对象
- 对象: 具有属性和方法的具体的事物
 
面向对象的创建:
  • 普通模式——每次创建对象都要设置一遍属性,属性相同时,代码冗余;
  •     ```
              var girl1 = {
                name: '如花',
                age: 18,
                sex: '女'
            ;
            var girl3 = new Object();
            girl3.name = '春花';
            girl3.age = 19;
            girl3.sex = '女';
    
        ```
  • 工厂模式——把创建对象和返回对象的功能封装在函数中,减少代码冗余,没有类的概念;
  •     ```
             function girl(name, age, sex) {
                var obj = new Object();  /* 创建对象 */
                obj.name = name;
                obj.age = age;
                obj.sex = sex;
                return obj; /* 返回对象 */
            }
    
            var g1 = girl('如花', 18, '女');
            console.log(g1);
    
            var g2 = girl('似玉', 18, '女');
            console.log(g2);
    
            console.log(g1 instanceof girl); //false
        ```
  • 构造函数模式——有类的概念,创建出来的实例是属于同一类,使用 instanceof 运算符可以检测出来,所有的属性和方法都是实例私有的;
  •         - 1)-构造函数函数名首字母大写(规律)
            - 2)-用new 方式执行,new操作符会自动创建并返回对象,这个对象称之为这个类的实例
            - 3)-构造函数里面的this指向当前实例
    
        ```
            function Girl(name, age, sex) {
                //自动创建对象
                this.name = name;
                this.age = age;
                this.sex = sex;
                //自动返回对象
            }
    
            var g1 = new Girl('如花', 18, '女');
            var g2 = new Girl('似玉', 18, '女');
    
           // Girl('如花', 18, '女'); //如果用普通函数方式执行,里面this指向window
           // console.log(window); 
        ```
  • 原型
  •         - 所有对象天生自带一个属性 `__proto__`, 指向的是其构造函数的原型
            - 所有的函数天生自带一个属性 `prototype`(原型)
  • 原型+构造函数模式——即可以实现私有属性,也可以实现共有方法
  •         ```
                 function Girl(name, age, sex, str) {
                    //自动创建对象
                    this.name = name;
                    this.age = age;
                    this.sex = sex;
                    this.str = str;
                    //自动返回对象
                }
    
                Girl.prototype.chat = function () {
                    // 公有方法里面的this指向当前调用它的实例  
                    console.log(this.str + 'hahaha');
                }
                var g1 = new Girl('如花', 18, '女', 'hello world');
                g1.chat();
    
            ```
  • 动态混合模式——把共有方法放在构造函数里边
  •         ```
                /* 动态混合模式 */
                function Girl(name, age, str) {
                    this.name = name;
                    this.age = age;
                    this.str = str;
                    if (typeof chat != 'function') { //如果不存在chat方法,就添加
                        Girl.prototype.chat = function () {
                            console.log(this.str);
                        }
                    }
                }
                var g1 = new Girl('小红', 18, 'hello world');
            ```
 
this的指向:
  • 在普通函数中,没有对象调用,this指向window;
  • 在对象方法中,this指向调用它的对象;
  • 在事件处理函数中,this指向触发事件的元素;
  • 在构造函数中,this指向当前实例;

 

01-19 05:57
查看更多