js new的理解和实现

187 阅读1分钟

在调用new的过程中会发生以上四件事情:

\

新生成了一个对象

链接到原型

绑定 this

返回新对象

function _new(){

  // 创建一个新对象

  const obj = {}

  // 获取构造函数

  const fn = [].shift.call(arguments)

  // 设置原型,使__proto__指向构造函数的原型,这样,新对像就可以访问到构造函数原型上的属性与方法

  obj.proto = fn.prototype

  // 改变this指向,这样,新对象就可以访问构造函数的属性和方法

  const result = fn.apply(obj, arguments)

  // 如果返回值是一个对象就返回该对象,否则返回构造函数的一个实例对象

  return result instanceof Object ? result : obj

}

\

另一种更加直观的理解方法:

\

function Person (age) {this.age= age;}

var p =  new Person();\

等同于

var p ={};

p.proto = Person.prototype;

Person.apply(p, 18);

\

原型可以理解为:

一个可以被复制(或者叫克隆)的一个类,通过复制原型可以创建一个一模一样的新对象,而且每一个新对象之间是相互独立,新对象实例会共享原型的所有属性和方法,也可以说原型就是一个模板,在设计语言中更准确的说是一个对象模板。

原型链:

当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构

\