Object Inheritance

2015-08-06 Jason Liao 更多博文 » 博客 » GitHub »

原文链接 http://jasonliao.me/posts/2015-08-06-obect-inheritance.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


先通过一张图来了解一下 prototype__proto__

javascript-object-layout

  • 所有东西都有 __proto__ 这个属性(除了 null),指向的就是他们类的原型,例如
    • 所有的 function__proto__ 都是指向 Function.prototype,包括普通的 function Foo() 还有 function Object()function Funtion()
    • f1, f2 是 Foo 的实例,所以 __proto__ 指向的是 Foo.prototype
    • Function.prototype__proto__ 则是指向 Object.prototype
    • Object.prototype__proto__ 指向的是 null
  • 只有 function 才有 prototype 属性,指向的是自己的原型,就像
    • function Foo()prototype 就是指向 Foo.prototype
    • function Object()prototype 就是指向 Object.prototype
    • function Function()prototype 就是指向 Function.prototype

Inheritance with the prototype chain

原型链继承,简单的说就是子类的原型是父类的实例。

var Person = function (age) {
  this.age = age;
};

Person.prototype = {
  sayAge: function () {
    console.log(this.age);
  }
};

var Student = function (name, age) {
  this.name = name;
  this.age = age;
};

Student.prototype = new Person();

var Jason = new Student('Jason', 21);
Jason.sayAge() // 21

这样就可以继承父类原型的方法。但是在构造子类的时候,没有办法给父类传递参数。

这时候就要用类式继承(借用构造函数)

Classical inheritance

类式继承其实就是子类的构造函数用 call 借用了父类的构造函数。这样就可以给父类传递构造的参数了

var Person = function (age) {
  this.age = age;
};

Person.prototype = {
  sayAge: function () {
    console.log(this.age);
  }
};

var Student = function (name, age) {
  Person.call(this, age);
  this.name = name;
};

var Jason = new Student('Jason', 21);

但是这样就还不可以与父类共享原型中的方法,所以一般我们会把原型链继承类式继承组合使用,称组合继承

Combination inheritance

var Person = function (age) {
  this.age = age;
};

Person.prototype = {
  sayAge: function () {
    console.log(this.age);
  }
};

var Student = function (name, age) {
  Person.call(this, age);
  this.name = name;
};

Student.prototype = new Person();

var Jason = new Student('Jason', 21);

Prototypal inheritance

Reference