美文网首页
js 面向对象 -- 封装

js 面向对象 -- 封装

作者: jingqian_xi | 来源:发表于2018-02-23 23:59 被阅读0次

    面向对象三大基本特性是封装,继承,多态。封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。Javascript中除了null和undefined一切皆对象,我们要把属性和方法封装成一个对象,甚至抽象成一个类来重复利用的时候就可以用到下面几个方法了

    封装的实现方式
    1. 单例模式

    创建方式:

    var person1 = {
      name: '张三',
      age: 11
    }
    var person2 = {
      name: '李四',
      age: 22
    }
    

    缺点:产生大量的重复代码

    1. 工厂模式

    创建方式:

    function person (name, age) {
      return {
        name: name
        age: age
      }
    }
    var person1 = person('张三', 11)
    var person2 = person('李四', 22)
    

    优点:减少了重复的代码
    缺点:不能识别对象

    1. 构造函数模式(constructor)

    创建方式:

    function Person (name, age) {
      this.name = name
      this.age = age
      this.say = function () {
        console.log(123)
      }
    }
    var person1 = new Person('张三', 11)
    var person2 = new Person('李四', 22)
    

    优点:可以识别对象constructor
    缺点:每个方法都会在实例上创建

    1. 原型模式

    创建方式:

    function Person () {}
    Person.prototype.name = name
    Person.prototype.age = age
    Person.prototype.say = function () {
      console.log(123)
    }
    var person1 = new Person('张三', 11)
    var person2 = new Person('李四', 22)
    

    优点:所有实例共享属性和方法
    缺点:共享引用类型的数据问题

    1. 构造函数+原型

    创建方式:

    function Person (name, age) {
      this.name = name
      this.age = age
    }
    Person.prototype.say = function () {
      console.log(123)
    }
    var person1 = new Person('张三', 11)
    var person2 = new Person('李四', 22)
    

    下面为简单的类和实例的关系

    obj.png
    原型模式的验证方法
    1. isPrototypeOf(): 判断某个proptotype对象和某个实例之间的关系
    Person.prototype.isPrototypeOf(person1)
    
    1. hasOwnProperty():判断某一个属性到底是本地属性还是继承自prototype对象的属性
    person1.hasOwnProperty('name')
    
    1. in:判断某个实例是否含有某个属性,包含本地和prototype的所有属性
    'name' in person1
    

    后面会继续总结继承和多态~

    相关文章

      网友评论

          本文标题:js 面向对象 -- 封装

          本文链接:https://www.haomeiwen.com/subject/aksfxftx.html