您的位置:首页 > 运维架构

OOP面向对象三大特点

2017-02-20 12:52 225 查看

OOP面向对象三大特点

  (一)封装将现实中一个事物的属性和功能集中定义在一个对象中。(创建对象)

    创建对象的3种方式

      1.直接量方式:(创建一个单独的对象)

      var obj={

        属性名:值,

              方法名:function(){ ...this.属性名...}  

      }

      2. 用new方式:

          var obj=new Object();

          obj.属性名=值;

          obj.方法名=function(){ ...this.属性名...}

      3.反复创建多个相同结构的对象的方式:2步

      ①定义构造函数:

      function 类型名(属性参数列表){

        this.属性名=属性参数;

             /*浪费内存,已被否定 this.方法名=function(){...this.属性名...}*/

      }

      ② 用new调用构造函数: 实例化一个对象。

          var obj=new 类型名(属性值列表);

          /*new: 1.创建新的空对象;2.设置新对象的__proto__继承构造函数的原型对象;3.用新对象调用构造函数,为新对象添加规定的属性和方法。4.将新对象的地址保存到变量中 */

       js中一切对象底层都是hash数组。

  (二)继承:父对象中的成员,子对象无需重复定义,即可直接使用。(代码重用,节约内存)

      js中的继承都是原型继承。

      原型对象:集中存储一类子对象共有成员的父级对象。

      原型链: 由各级对象的__proto__属性逐级继承,形成的链式结构。(原型链控制着对象中属性的使用顺序)

      继承中相关的API:

      1. 判断指定"属性名"是否是obj的自有属性: var bool=obj.hasOwnProperty("属性名")

      2. 判断是否是共有属性:  !obj.hasOwnProperty("属性名") &&("属性名" in obj)

      3. 获取原型对象: 2种方式: 构造函数.prototype;Object.getPrototypeOf(child)

      4. 删除属性: delete 对象.属性名

      5. 判断一个对象是不是数组类型:

           1. 判断father是否是child的原型链上的父级对象:father.isPrototypeOf(child);

           2. 判断child是否是构造函数的实例:child instanceof 构造函数;

         3. 输出对象的内部属性class: Object.prototype.toString.call(obj);

           4. 判断obj是否是数组类型: Array.isArray(obj)

          如何自定义继承: 3种:

           1. 直接修改一个对象继承另一个对象:Object.setPrototypeOf(child,father);

           2. 修改构造函数的原型对象,批量修改之后所有子对象的父对象:构造函数.prototype=father(时机: 在开始创建子对象之前就修改)

           3. 两种类型间的继承: inherits&&extends

             抽象: 如果多个子类型之间有相同的属性结构和方法定义,就要抽象出一个父类型,将相同的属性结构和方法定义统计定义在父类型中。

             在子类型构造函数中借用父类型构造函数:extends扩展

             function 子类型构造函数(...){

               父类型构造函数.call(this,参数1,参数2,...)//new 子类型构造()->this->正在创建的新对象

                 ...扩展新属性

             }

            其实: 父类型构造函数.call(this,参数1,参数2,...)可简写为:父类型构造函数.apply(this,arguments)

            让子类型原型继承父类型原型:inherits继承

           Object.setPrototypeOf(子类型原型, 父类型原型)

      call vs apply:

        相同:都是强行借用任意函数,并替换函数中的this为指定对象。

        不同:参数:

            call,只能将传入借用的函数的参数,单独传入。

            apply,可将传入借用的函数的参数,以数组方式传入。apply可自动打散数组为单个参数。

  (三)多态:

     重写(override):如果子对象觉得父对象继承来的成员不好用,可子定义同名的自有成员,来覆盖父对象的成员。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: