继承

混入式继承

最简单的继承,使用 for in 循环为对象动态添加成员,代码如下:

var obj1 = {
  name: 'zzw',
  age: '18'
}

console.log(obj1)

var obj2 = {}

for (var k in obj1) {
  obj2[k] = obj1[k]
}

console.log(obj2)

原型式继承:Object.create

ES5 为我们提供了一个方法 Object.create(obj),返回值为一个继承于 obj 对象的对象

var subObj = Object.create(superObj) // subObj继承了superObj的成员

内部实现:

function create(superObj) {
  var F = function() {}
  F.prototype = superObj
  return new F()
}

由于此方法是 ES5 提供的,所以存在兼容性问题.
如何解决兼容性问题呢?

检测浏览器能力.

if (Object.create) {
  //若浏览器支持
  var subObj = Object.create(superObj)
} else {
  //若浏览器不支持,自己添加这个方法
  Object.create = function() {
    var F = function() {}
    F.prototype = superObj
    return new F()
  }
}

封装成函数:

function create(superObj) {
  if (Object.create) {
    return Object.create(superObj)
  } else {
    Object.create = function() {
      var F = function() {}
      F.prototype = superObj
      return new F()
    }
  }
}

通过原型继承(此处不讨论原型链,单纯继承原型对象的成员)

  • 给原型对象中添加成员(对象的动态特性,非严格意义上的继承)
Person.prototype.sayHello = function() {
  console.log('hello')
}

var p = new Person('冯巩', '50')

p.sayHello() //这里的p对象就继承了原型对象
  • 直接替换原型对象,原型对象原本的属性无法保存
var parent = {
  saygoodbye: function() {
    console.log('goodbye')
  }
}

Person.prototype = parent

var p1 = new Person('zzw', '20')

p1.saygoodbye() //p对象就继承了原型对象,也就是我们的parent对象
  • 用混入的方式为原型对象添加成员,保存了原型对象原有的属性(sayhi 方法)
Person.prototype.sayhi = function() {
  console.log('hi')
}

var parent = {
  saygoodbye: function() {
    console.log('goodbye')
  }
}

for (var k in parent) {
  Person.prototype[k] = parent[k]
}

var p2 = new Person('zzw', '18')

p2.saygoodbye()
p2.sayhi()