js 面向对象 -- 封装

2018-02-23  本文已影响0人  jingqian_xi

面向对象三大基本特性是封装,继承,多态。封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。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

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

上一篇下一篇

猜你喜欢

热点阅读