用 JavaScript 实现面向对象编程中的要素

传统的面向对象要素:

  • 可以由一个类的构造函数构造出若干个同类的对象

    JavaScript 的 new 关键字允许将一个函数视作构造函数,可以创建出若干个与这个构造函数相关联的对象,JavaScript 没有类的概念,构造函数代替类的概念,作为这一类对象的标识。

  • 类可以拥有静态方法和静态属性

    直接为构造函数设置属性即可,在 JavaScript 中方法和属性几乎没有什么区别。

  • 对象可以拥有实例属性,这些属性每个对象都有一份拷贝

    应在构造函数中为新建的对象(构造函数中的 this)初始化实例属性,这些属性不会与其他对象共享。

  • 对象可以拥有实例方法,这些方法来自于类的定义

    JavaScript 对象会从其原型对象继承属性和方法,由 new 关键字创建的对象的原型默认是构造函数的原型,因此可以通过为构造函数的原型添加方法的方式,为其创建的对象添加共用的方法。

  • 一个类(派生类)可以继承自另一个类(基类),派生类可以覆盖来自基类的方法

    应将派生类的构造函数的原型的原型,设置为被继承的的构造函数的原型,在进行方法调用时,JavaScript 会沿着原型链逐个查找方法。派生类可以通过为构造函数的原型设置方法的方式,覆盖来自基类的方法。

  • 在基类中调用派生类对象的方法时,如果这个方法被派生类覆盖,那么应调用派生类的方法(多态)

    JavaScript 会沿着原型链查找方法,一旦在派生类找到了同名方法,就不会使用基类的方法。

详见 JavaScript 权威指南