在调用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__中查找,这样一层一层向上查找就会形成一个链式结构
\