javascript
的原型链是剪不断理还乱,下面我们用简单的表达式,来理一理他们之间的继承关系:
Object.prototype = null; //原型链顶端为null
Function.prototype = new Object;
Array.prototype = new Object;
Boolean.prototype = new Object;
String.prototype = new Object;
Function = new Function;
Object = new Function;
Array = new Function;
Boolean = new Function;
String = new Function;
通过上面我们可以比较清楚的认识到,javascript
的继承说白了其实就是原型链的继承,通过new
的形式实例化对象实现继承,实现继承后,会有个属性称之为指针(__proto__
)指向被继承的原型。当然现在的es6
有专门的class
,其实也是一种语法糖而已。我们可以来分析下上面的发生了什么。
分析一: Function
、Array
、Boolean
、String
他们的原型prototype
都是继承了Object
,换句话说在这些的原型里面,已经拥有了Object原型的所有属性和方法。我们可以通过原型指针__proto__
的指向来验证下:
Function.prototype.__proto__ === Object.prototype; //true
Array.prototype.__proto__ === Object.prototype; //true
Boolean.prototype.__proto__ === Object.prototype; //true
String.prototype.__proto__ === Object.prototype; //true
分析二: Object
、Function
、Array
、Boolean
、String
他们自身都是继承了Function
。
Object .__proto__ === Function.prototype; //true
Function.__proto__ === Function.prototype; //true
Array.__proto__ === Function.prototype; //true
Boolean.__proto__ === Function.prototype; //true
String.__proto__ === Function.prototype; //true
分析三: Function
和Object
关系“不一般”
刚刚从分析二可以看到Object
、Function
、Array
、Boolean
、String
他们是继承了Function
,那Function
是怎么来的呢?我们通过最上面的关系代码中,看到Function = new Function
,也就是说Function
是继承了自己的原型而已。那Function的原型又是哪里来的,由上看到 Function.prototype = new Object
,也就是说Function的原型是继承了Object.prototype
。这里有一个比较绕的关系:
Function.prototype = new Object;
Object = new Function;
所以以下条件都是true:
Object instanceof Function //true
Function instanceof Object //true
总结:“继承者的原型指针(__proto__
)永远指向,被继承者的原型(prototype
)”,记住这句话就很容易搞清楚这些错综复杂的继承关系。