传统的面向对象要素:
● 可以由一个类的构造函数构造出若干个同类的对象
JavaScript 的 new 关键字允许将一个函数视作构造函数,可以创建出若干个与这个构造函数相关联的对象,JavaScript 没有类的概念,构造函数代替类的概念,作为这一类对象的标识。
● 类可以拥有静态方法和静态属性
直接为构造函数设置属性即可,在 JavaScript 中方法和属性几乎没有什么区别。
● 对象可以拥有实例属性,这些属性每个对象都有一份拷贝
应在构造函数中为新建的对象(构造函数中的 this)初始化实例属性,这些属性不会与其他对象共享。
● 对象可以拥有实例方法,这些方法来自于类的定义
JavaScript 对象会从其原型对象继承属性和方法,由 new 关键字创建的对象的原型默认是构造函数的原型,因此可以通过为构造函数的原型添加方法的方式,为其创建的对象添加共用的方法。
● 一个类(派生类)可以继承自另一个类(基类),派生类可以覆盖来自基类的方法
应将派生类的构造函数的原型的原型,设置为被继承的的构造函数的原型,在进行方法调用时,JavaScript 会沿着原型链逐个查找方法。派生类可以通过为构造函数的原型设置方法的方式,覆盖来自基类的方法。
● 在基类中调用派生类对象的方法时,如果这个方法被派生类覆盖,那么应调用派生类的方法(多态)
JavaScript 会沿着原型链查找方法,一旦在派生类找到了同名方法,就不会使用基类的方法。
详见 JavaScript 权威指南。