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
}