new一个实例实现的原理

62 阅读1分钟

先看普通的构造函数

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

其实在new的过程中内部实现了隐式创建对象

function Person(name,age) {
    //this={};隐式执行让this等于一个对象
     this.name=name;
     this.age=age;
    //return this 隐式返回了this
}
new Person;

下面来写一个函数来实现new的作用

function Animal(name,sex) {
    this.name=name;
    this.sex=sex;
}
Animal.prototype.call=function (){
    console.log('I am a '+this.name+',and I am a '+this.sex)
}
function create() {
 // 创建⼀个空的对象
 let obj = new Object()
 // 获得构造函数
 let Con = [].shift.call(arguments)
 // 链接到原型
 //obj.__proto__ = Con.prototype
  //采用Object.creact()方法创建原型链
  const obj = Object.creact(Con)
 // 绑定 this,执⾏构造函数
 let result = Con.apply(obj, arguments)
 // 确保 new 出来的是个对象 如果构造函数返回对象就是生成这个对象,否则返回obj
 return typeof result === 'object' ? result : obj
}

const obj1=create(Animal,'老虎','male');
const obj2=create(Animal,'狐狸','female');