前言
一直没弄清楚,今天好好花点时间搞搞清楚 new
手写new
function new(Fn) { // Fn 是构造函数
lat obj = {}; // 1
obj.__proto__ = Fn.prototype; // 2
let res = Fn.call(obj); // 3
return typeof res === 'Object' ? res : obj; // 4
}
1、创建空对象
2、构造函数this指向新的对象
3、执行构造函数
4、返回新对象 ( 构造函数 return 一个引用类型:返回引用return的内容;否则返回所有内容)
使用:
function new(Fn) { // Fn 是构造函数
lat obj = {};
obj.__proto__ = Fn.prototype;
let res = Fn.call(obj);
return typeof res === 'Object' ? res : obj;
}
var Person = function(){
this.name = 'aaa';
this.fn = function() {
console.log(this.name);
}
}
var a = new(Person);
字面量 好还是 new 好?
{}是字面量,可以立即求值,而new Object() 本质上是方法(只不过这个方法是内置的)调用, 既然是方法调用,就涉及到在 proto
链中遍历该方法,当找到该方法后,又会生产方法调用必须的 堆栈 信息,方法调用结束后,还要释放该堆栈
网友评论