博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【干货】模拟js的new
阅读量:6316 次
发布时间:2019-06-22

本文共 1310 字,大约阅读时间需要 4 分钟。

A、过程

  1. 创建一个新对象;

  2. 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象); obj.__proto__ = P.prototype;

  3. 执行构造函数中的代码(为这个新对象添加属性);

  4. 返回新对象。

  • 注意:若构造函数中返回this或返回值是基本类型(number、string、boolean、null、undefined)的值,则返回新实例对象;若返回值是引用类型的值,则实际返回值为这个引用类型。

B、代码

/* * @Author: laifeipeng  * @Date: 2019-02-22 14:07:42  * @Last Modified by: laifeipeng * @Last Modified time: 2019-02-22 14:13:37 */ const New = function (P, ...arg) {  const obj = {};  obj.__proto__ = P.prototype;  const rst = P.apply(obj, arg);  return rst instanceof Object ? rst : obj;}// 极简写法function New2(fn, ...arg) {  const obj = Object.create(fn.prototype);  const rst = fn.apply(obj, arg);  return rst instanceof Object ? rst : obj;}function Person(name, age, job) {  this.name = name;  this.age = age;  this.job = job;  this.sayName = function () {    alert(this.name);  };}const p1 = New(Person, "Ysir", 10, "A");const p2 = New(Person, "Sun", 20, "B");console.log(p1.name);//Ysirconsole.log(p2.name);//Sunconsole.log(p1.__proto__ === p2.__proto__);//trueconsole.log(p1.__proto__ === Person.prototype);//true// 与原生js的new对比const p = new Person('laifeipeng', 20, "C");console.log(p.name);//laifeipengconsole.log(p.__proto__ === p1.__proto__);//trueconsole.log(p.__proto__ === Person.prototype);//trueconsole.log(Person.prototype.constructor === Person);//true// 结论--正确!复制代码

3、图解new及原型链

转载地址:http://iyyaa.baihongyu.com/

你可能感兴趣的文章
云服务正在吞噬世界!
查看>>
阅读Android源码的一些姿势
查看>>
Web语义化标准解读
查看>>
一份代码构建移动、桌面、Web全平台应用
查看>>
高性能 Lua 技巧(译)
查看>>
区分指针、变量名、指针所指向的内存
查看>>
异步编程的世界
查看>>
最近话题火爆的四件事你知道不?
查看>>
SpringBoot整合MyBatis
查看>>
云计算产业如何率先推行信用管理?
查看>>
Android 类库书签更新(一)
查看>>
Unity3D Input按键系统
查看>>
简单的一条SQL,不简单的做事思维 NOT IN 、NOT EXISTS、LEFT JOIN用法差别 ...
查看>>
DataWorks:任务未运行自助排查
查看>>
ionic/cordova热部署
查看>>
「镁客早报」特斯拉裁员,马斯克解释没有办法;微软推出Azure DevOps赏金计划...
查看>>
centos 7.4 使用 pgxc_ctl 安装与使用
查看>>
Redis 单key值过大 优化方式
查看>>
【数据库】表分区
查看>>
nutz-sqltpl 1.3.4.RELEASE 发布,在 Nutz 项目中“解决 Java 拼接 SQL”问题
查看>>