Javascript原型理解

Javascript原型理解

  本篇只是个人对于javascript原型的理解,可能与实际的原理有一些偏差,个人认为javascript对类的实现其实核心是如何通过对象模拟类这个概念具有的功能。

创建类

  javascript创建类,就是需要创建一个Object有着特定的键值对,因此我们需要一个函数和一个空的Object作为基础,这个函数一般被称为构造函数。

1
2
3
4
var A = function(){
console.log('A\'s constructor');
}
var a = new A();

  我们需要考虑javascript是如何执行以上过程的,当我们调用 new A()时,首先创建一个a = {},之后使用类似A.apply(a),完成初始化。

继承类

  通过以上的想法可以生成一个类实例,但是这并不足以完成类所应该完成的功能,接下来我们思考继承的实现。

  继承需要用到键 __proto__,继承本质在于子类具有父类的功能,则键 __proto__需要指向父类,在javascript中即指向一个Object。在 new操作中并不仅仅只进行了简单的初始化,还为 a赋予了一个新键 __proto__,使其指向父对象。那么父对象在哪?父对象保存在 A.prototype的中。这两个键容易使我们迷惑,但是我们其实只需要知道继承链是通过 __proto__实现的就足够了。子类没有的键会查找 a.__proto__引用的对象里是否存在,没有则再查找 a.__proto__.__proto__里键是否存在,从而构成一个继承链,直到为null

1
a.__proto__ === A.prototype; // 返回true