概念准备
面向对象编程
- 我们熟悉的Java和C#里,面向对象的两个基本概念是类class和实例instance,而ES6以前的Javascript并没有设计class。
- Javascript里的class是通过原型来实现的,通过将某个对象的__proto__属性指向另外一个对象的prototype来实现类和继承,如classA.__proto__ = classB.prototype,看上去就像B是A的父类,A继承自B类。
原型链、隐式原型、显式原型
- 通常我们说的隐式原型指的是__proto__,而显式原型指的是prototype。
- prototype在IE里不提供,因此考虑到兼容性的话可以通过Object.getPrototypeOf(对象)来获得。
- 原型链通常指的是隐式原型链,JavaScript里任何东西都是对象,任何一个对象内部都有一个内置对象叫__proto__,即隐式原型,它可以包含任何东西让对象继承。
- 当然__proto__本身也是一个对象,它自己也有自己的__proto__,这样一级一级向上,就构成了一个__proto__链,即原型链。
- 当然原型链不会无限向上,它有个终点,可以称为原型链的顶端,或者root,它是一个特殊的对象,它的__proto__为null,如下所示:
obj.__proto__.__proto__......__proto__ === null;
- 所有对象都有__proto__,而只有function对象拥有prototype,因此function对象既有__proto__又有prototype。
所有对象的顶端Object.prototype
所有函数的顶端Function.prototype
参考资料
- Javascript原型链以及Object、Function之间的关系
- 廖雪峰官方网站:Javascript面向对象编程