实现一个New函数

先看实现

// 构造一个New函数 
function New(func) {
  let o = {};
  o.__proto__ = func.prototype;
  Object.setPrototypeOf(o, func.prototype);
  func.call(o);
  return o;
}

function Person() {
  this.age = 23
}
Person.prototype.male = 'man';

let p = New(Person);
console.log(p);
console.log(p instanceof Person);
console.log(typeof p);
console.log(p.male);
屏幕快照 2019-03-25 下午3.30.54.png

new的时候发生了什么?

var o = new Object();
o.[[prototype]] = func.prototype;
func.call(o);
  1. 声明一个空对象
  2. 将function的原型对象赋值给 o 的内部属性
  3. 通过func.call 将 this.age等变量绑定到o上
  4. return o

__proto__是 大多数浏览器厂商支持的,可用于改变一个对象[[prototype]]属性,此特性已经从Web标准中废弃,建议使用Object.setPrototypeOf(obj, prototype) 和Object.getPrototypeOf() 函数来改变或是获取此[[prototype]]

参考

Object.prototype.proto

new运算符

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • JavaScript面向对象程序设计 本文会碰到的知识点:原型、原型链、函数对象、普通对象、继承 读完本文,可以学...
    moyi_gg阅读 4,108评论 0 2
  • JavaScript面向对象程序设计本文会碰到的知识点:原型、原型链、函数对象、普通对象、继承 读完本文,可以学到...
    亖巠阅读 2,472评论 0 0
  • 1.属性的简洁表示法 允许直接写入变量和函数 上面代码表明,ES6 允许在对象之中,直接写变量。这时,属性名为变量...
    雨飞飞雨阅读 4,853评论 0 3
  • defineProperty() 学习书籍《ECMAScript 6 入门 》 Proxy Proxy 用于修改某...
    Bui_vlee阅读 3,856评论 0 1
  • 原型 prototype (原型)属性每个函数都有一个prototype属性,这个属性指向一个对象,这个对象就是原...
    LeoCong阅读 2,999评论 0 1

友情链接更多精彩内容