一、写一个new,看下new的过程发生了什么;
1.场景一 (函数没有返回值);
function Person(name) {
this.name = name,
this.say = function () {
console.log('说话')
}
}
let p1 = new Person("小红");
console.log('p1',p1)
console.log("p1的name", p1.name) //小红
console.log('P1的隐式原型', p1.__proto__ === Person.prototype) // true
由上可得:
- new 的过程创建了一个新的对象;
- 把 p1.__proto__链接到 Person.prototype 身上;
- 会继承构造函数身上静态的属性,动态的方法;
2.场景二 (函数有返回值);
function Person2(name) {
this.name = name;
return { age: 20 }
};
let p2 = new Person2('小红');
console.log('p2',p2) //{age:20}
由上可得:
- 如果构造函数有返回值,则返回构造函数的返回值。
二、封装一个new的过程;
以上两种场可知new的过程:
function myNew(callBack, ...arg) {
//1.创建一个简单的javaScript空对象,即{};
let obj = {};
//2.修改实例obj的隐式原型指针(直向callBack的显式原型对象)
obj.__proto__ = callBack.prototype
//3.改变this指针,指向obj,并给obj赋值。
const res = callBack.apply(obj, arg);
//4.如果callBack没有返回对象,则返回res
return obj
}
const p3 = myNew(Person, '小红')
console.log('P2', p2)