new
很多时候面试官都会问:当new出一个实例的时候,它经过了哪几个步骤?,今天我们就从实现new语法糖来深入了解这些步骤
先看看new的功能。
function Parent(name,age) {
this.name = name
this.age = age
this.xin = '钱'
}
Parent.prototype.getName = function () {
console.log(this.xin + this.name)
}
var son = new Parent('帅帅', 26)
var son1 = new Parent('聪聪', 26);
console.log(son.name, son.age) //帅帅 26
son.getName(); //钱帅帅
console.log(son1.name, son1.age); //聪聪 26
son1.getName(); //钱聪聪
从上述代码中我们可以看出实例son,son1可以访问:
1.访问到 Parent 构造函数里的属性
2.访问到 Parent.prototype 中的属性
第一版实现
分析:要建立一个对象(obj),并且obj具有构造函数里的属性,我们可以用经典继承:用Parent.apply(obj,arguments)来给obj添加新属性。通过原型链我们可以知道实例的_proto_指向构造函数的prototype,正是因为这样实例可以访问原型上的属性.
function newTest() {
var obj = {}
Constructor = [].shift.call(arguments)
obj._proto_ = Constructor.prototype
Constructor.apply(obj,arguments)
return obj
}
从代码中我们可以看出如下几步骤:
1. 新建一个obj对象
2. 取出arguments第一项也就是我们传入构造函数,shift是改变数组的,所以此时arguments第一项已经没有了
3. 将obj的原型指向构造函数的prototype,使他可以访问构造函数原型中的属性
4. 使用apply改变构造函数this指向,使他可以访问构造函数的属性
5. 输出obj对象