js中所有的对象都是继承Object这个原型对象而来。javascript中没有继承的语法,其实现是通过原型链来连接对象与对象之间的关系。

原型链

  1. 每个对象都有__proto__属性,该属性指向其原型对象,在调用实例的方法和属性时,如果在实例对象上找不到,就会往原型对象上找
  2. 构造函数的prototype属性也指向实例的原型对象
  3. 原型对象的constructor属性指向构造函数

New实现

我们可以通过new可以创建一个对象,使用new的时候:

  1. 创建一个新对象;
  2. 这个对象的proto要指向构造函数的原型对象 ,
  3. 执行构造函数中的代码(为这个新对象添加属性)
  4. 如果构造函数返回值是对象则返回这个对象,如果不是对象则返回新的实例对象
1
2
3
4
5
6
7
8
function myNew(fn,...args){
var obj = {};
// 实现继承,实例可以访问函数的属性
var obj.__proto__ == fn.prototype;
// 调用构造方法,并改变其 this 指向到实例
var res = fn.apply(obj, args);
return typeof res === 'object' && res!== null ? res : obj;
}

实现继承