美文网首页前端100问
【前端100问】Q14:如何实现一个 new

【前端100问】Q14:如何实现一个 new

作者: alanwhy | 来源:发表于2020-12-10 13:57 被阅读0次

写在前面

此系列来源于开源项目:前端 100 问:能搞懂 80%的请把简历给我
为了备战 2021 春招
每天一题,督促自己
从多方面多角度总结答案,丰富知识
如何实现一个 new

正文回答

先理清楚 new 关键字调用函数都的具体过程,那么写出来就很清楚了

  1. 首先创建一个空的对象,空对象的__proto__属性指向构造函数的原型对象
  2. 把上面创建的空对象赋值构造函数内部的 this,用构造函数内部的方法修改空对象
  3. 如果构造函数返回一个非基本类型的值,则返回这个值,否则上面创建的对象
function _new(fn, ...arg) {
  const obj = Object.create(fn.prototype);
  const ret = fn.apply(obj, arg);
  // 判断构造函数执行的返回类型
  return ret instanceof Object ? ret : obj;
}
function _new(fn, ...arg) {
  var obj = Object.create(fn.prototype);
  const result = fn.apply(obj, ...arg);
  return Object.prototype.toString.call(result) == "[object Object]"
    ? result
    : obj;
}

来自 MDN 的解释

MDN new 运算符

new 关键字会进行如下的操作:

  1. 创建一个空的简单 JavaScript 对象(即{});
  2. 链接该对象(设置该对象的 constructor)到另一个对象 ;
  3. 将步骤 1 新创建的对象作为 this 的上下文 ;
  4. 如果该函数没有返回对象,则返回 this

(译注:关于对象的 constructor,参见 Object.prototype.constructor)

function Car() {}
car1 = new Car();
car2 = new Car();

console.log(car1.color); // undefined

Car.prototype.color = "original color";
console.log(car1.color); // original color

car1.color = "black";
console.log(car1.color); // black

console.log(car1.__proto__.color); //original color
console.log(car2.__proto__.color); //original color
console.log(car1.color); // black
console.log(car2.color); // original color

相关文章

  • 【前端100问】Q14:如何实现一个 new

    写在前面 此系列来源于开源项目:前端 100 问:能搞懂 80%的请把简历给我[https://github.co...

  • 前端100问

    HTML部分 1.空标签都有哪些?空标签什么特点2.行内元素?3.块级元素? CSS部分 JS部分 HTTP部分

  • 2019-04-03JavaScript手写代码无敌秘籍

    「中高级前端面试」JavaScript手写代码无敌秘籍 手写路径导航 实现一个new操作符 实现一个JSON.st...

  • ★ 原型、原型链、继承

    如何理解原型,如何理解原型链? new 一个对象发生了什么? new 的实现 每一个函数 ( 类 ) 都有一个 p...

  • 如何实现一个 new

    在调用 new 的过程中会发生以下四件事情: 1.新生成了一个对象2.链接到原型3.绑定 this4.返回新对象 ...

  • 区块链100问(11-20集)

    11、区块链100问 第11集:比特币为什么还没挖完? 12、区块链100问12集:比特币如何实现总量恒定? 13...

  • Python重要知识点总结

    __new__.__init__区别,如何实现单例模式,有什么优点__new__是一个静态方法,__init__是...

  • 【前端100问】Q63:如何设计实现无缝轮播

    写在前面 此系列来源于开源项目:前端 100 问:能搞懂 80%的请把简历给我[https://github.co...

  • 前端开发100问

    开发中有越来越多的困惑,还是要在开发中多问问自己为什么是这样,还有没有更好的办法,这是一种思维习惯,也是摆脱单纯开...

  • 如何手写一个new

    和人交流时发现,现在面试可能会问到如何手写一个new,也就是如何自己手写方法实现new()功能 ,觉得自己从没想过...

网友评论

    本文标题:【前端100问】Q14:如何实现一个 new

    本文链接:https://www.haomeiwen.com/subject/ogalgktx.html