js中关键字new的原理(含实现代码)

new的原理

在调用new的过程中都干了什么?

  • 在内存中创建一个新对象
  • 新对象内部的prototype特性被赋值为构造函数的prototype属性
  • 构造函数内部的this被赋值为这个新对象(即this指向新对象)
  • 执行构造函数内部的代码(即给新对象添加属性)
  • 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象

使用js原生代码实现new

function myNew () {
	//创建一个新对象
	var obj = new Object ();
	//取出参数中的第一个参数,获得构造函数
	var constructor = Array.prototype.shift.call(arguments);
	//连接原型,新对象可以访问原型中的属性
	obj._proto_ = constructor.prototype;
	// 执行构造函数,即绑定 this,并且为这个新对象添加属性
	var result = constructor.apply(obj,arguments);
	return typeof result === "object" ? result :obj ;
}

更简单的写法

function myNew(fn) {
	const obj = Object.create(fn.prototype);
	result = fn.apply(obj, [...arguments].slice(1));
	return typeof result === "object" ? result : obj;
}

var obj = Object.create(fn.prototype) 等价于:

 var obj = new Object ();

 obj._proto_ = constructor.prototype;

测试实例

先定义一个构造函数,再使用new关键字创建一个实例

function Person (name,age){
  this.name = name;
  this.age = age;
  this.say = function () {
      console.log("I am " + this.name)
  }
}

let person1 = new Person("Star",20);
console.log(person1.name);      
console.log(person1.age);       
person1.say();  

得到的结果是:
在这里插入图片描述
再使用js原生代码写的myNew函数创建实例。(需要把构造函数当做参数传递进去)

function Person (name,age){
  this.name = name;
  this.age = age;
  this.say = function () {
      console.log("I am " + this.name)
  }
}

let person1 = new Person("Star",20);
console.log(person1.name);      
console.log(person1.age);       
person1.say();  

let person2 = myNew (Person,"Star",20);
console.log(person2.name);      
console.log(person2.age);       
person2.say(); 

结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值