Lawguancong / Daily-Charging-Learning

0 stars 0 forks source link

new过程 #35

Open Lawguancong opened 3 years ago

Lawguancong commented 3 years ago
  1. 新生成了一个对象
  2. 链接到原型
  3. 绑定 this
  4. 返回新对象
function new() {
// 创建一个空的对象
let obj = new Object()
// 获得构造函数
let Con = [].shift.call(arguments)
// 链接到原型
obj.__proto__ = Con.prototype
// 绑定 this,执行构造函数
let result = Con.apply(obj, arguments)
// 确保 new 出来的是个对象
return typeof result === 'object' ? result : obj
}

function new() {
let obj = {};
let [constructor, ...args] = [...arguments];
obj.__proto__ = constructor.prototype;
let res = func.apply(obj, args);
if ((res && typeof res == "object") || typeof(res) == "function") {
  return res;
}
return obj;
}

new的原理是什么?通过new的方式创建对象和通过字面量创建有什么区别? 对于创建一个对象来说,更推荐使用字面量的方式创建对象。因为你使用 new Object() 的方式创建对象需要通过作用域链一层层找到 Object,但是你使用字面量的方式就没这个问题。

字面量创建对象,不会调用 Object构造函数, 简洁且性能更好; new Object() 方式创建对象本质上是方法调用,涉及到在proto链中遍历该方法,当找到该方法后,又会生产方法调用必须的 堆栈信息,方法调用结束后,还要释放该堆栈,性能不如字面量的方式。 通过对象字面量定义对象时,不会调用Object构造函数。

• 创造一个全新的空对象 • 这个对象会被执行 [[Prototype]] 连接,将这个新对象的 [[Prototype]] 链接到这个构造函数.prototype 所指向的对象 • 这个新对象会绑定到函数调用的 this • 如果函数没有返回其他对象,那么 new 表达式中的函数调用会自动返回这个新对象

• 创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型 • 属性和方法被加入到 this 引用的对象中 • 新创建的对象由 this 所引用,并且最后隐式的返回 this

• 创建一个新空对象。 • 这个新对象会被执行[[原型]]连接。 • 属性和方法被加入到 this 引用的对象中。并执行了构造函数中的方法. • 如果函数没有返回其他对象,那么返回创建的这个新对象,否则返回构造函数的执行结果。

new 一个构造函数,如果函数返回 return {} 、 return null , return 1 , return true 会发生什么情况? 如果函数返回一个对象,那么new 这个函数调用返回这个函数的返回对象,否则返回 new 创建的新对象