理解JavaScript中的原型继承

原型是JavaScript的核心概念之一,理解JavaScript的原型就显得尤为重要。在JavaScript中,类的所有对象都从同一个原型对象上继承属性,因此,原型对象是类的核心。

除了null对象之外,每一个JavaScript对象都和另一个对象关联,”另一个”对象就是原型。
根据创建对象的方式的不同,对象的原型也不同。举例来讲,通过对象直接创建的对象拥有同一个原型,可以通过Object.prototype来获得对原型对象的引用。通过关键字new和构造函数调用创建的对象就是构造函数的prototype的值。

这里需要指出的一点就是并不是每一个JavaScript对象都有原型,数量虽然不多,但是确实存在,Object.prototype就是其中的一个。

下面让我们用实际的例子来看一下,原型继承到底是如何工作的

Code:
  function Parent(name, job) {
    this.name = name;
    this.job  = job;
  }

  Parent.prototype.getName = function() {
    return this.name;
  }

  Parent.prototype.getJob = function() {
    return this.job;
  }

  var parent = new Parent("Jack", "developer");
  console.log(parent.getName()); //Jack
  console.log(parent.getJob()); //developer

  function Child(name, job) {
    this.name = name;
    this.job  = job;
  }
  Child.prototype = new Parent();

  var child = new Child("Jones", "manager");
  console.log(child.getName());//Jones
  console.log(child.getJob());//manager

基本的原型继承是相当简单的,但是这也有一个明显的问题,就是会重复构造函数中的初始化操作,这显然不是我们想看到的。
为了简化操作,我们可以在子类的构造函数上做文章。

Code:
function Child(name. job) {
  Parent.apply(this, arguments);
}

利用create函数

这是来自JavaScript大师Douglas Crockford的方法,具体做法是给Object对象增加一个create方法,创建一个使用原对象作为原型的新对象。

Code:
Object.create = function(o) {
  var F = function () {};
  F.prototype = o;
  return new F();
}

原型关系是一种动态的关系,如果我们给一个原型添加新的属性,那么新创建的属性会对所有的基于该原型创建的对象可见。