js中new的原理,及简单实现

new原理

  • 创建一个空对象
  • 空对象的__proto__指向构造它的构造函数的原型对象,这样就可以沿着原型链去访问构造函数原型对象上的数据和方法
  • 在构造函数内部的this指向这个对象,执行构造函数
  • 返回这个对象

简单实现

function _new(){
	var obj = {}
	//返回arguments中的第一个元素,这个元素是传进来的构造函数
	var constructor = [].shift.call(arguments)	
	//step2  
	var obj.__proto__ = constructor.prototype
	//step3 改变constructor的this指向,使this指向obj
	//并且执行constructor这个构造函数,arguments是传参
	var rs = constructor.apply(obj,arguments)
	//返回对象
	return typeof rs ==== 'object'?rs: obj
}

关于构造函数的this返回问题

关于最后一步,返回这个对象
我们平常见的构造函数如:

function Person(name,age){
	this.name = name
	this.age = age
}
var person = new Person('xiaoming', 19)

虽然并没有看到,Person里有return 这个动作。但事实上,它有一个return this的隐式动作。

所以一般情况下,如果你把一个函数当做构造函数来使用,那么最好不要给它设置返回值。 如果设置了返回值呢?

  • return后面跟的不是对象,就忽略return语句,照常返回this对象
  • return 后面跟了一个对象,new会返回return语句指定的对象

举例:

var Vehicle = function () {
  this.price = 1000;
  return 1000;
};

(new Vehicle()) === 1000// false 正常使用
var Vehicle = function (){
  this.price = 1000;
  return { price: 2000 };
};

(new Vehicle()).price
// 2000

这是为什么我们在

function _new(){
//.....
//这是为什么我们在_new中会模仿,加上这一句
	return typeof rs ==== 'Object'? rs:obj
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值