博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
new命令的原理
阅读量:5902 次
发布时间:2019-06-19

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

function Person(name, age) {    this.name = name;    this.age = age}var person = new Person('小明', 18);console.log(person.name);  //小明console.log(person.age);   //18复制代码

执行new命令会经过以下几个步骤

  1. 创建一个空对象,这个对象将会是new Person()返回的对象实例;
  2. 将这个空对象的原型指向构造函数prototype属性;
  3. 构造函数this指向空对象,并运行构造函数;
  4. 判断构造函数返回的是不是对象,是的话返回默认对象,不是的话返回之前创建的空对象,没有返回值默认返回空对象

用代码解释一下

function Person(name, age) {    this.name = name;    this.age = age    //return '小明' //如果返回的不是Object类型,将忽略这个return 返回之前创建的空对象   /* return {     //如果返回的是Object类型,直接返回这个对象        'name' : '小花',        'age' : 22    } */}function _new(person, ...rest){    var obj = {};  // 创建一个空对象,这个对象将会是返回的对象实例    obj.__prototype__ = person.prototype; // 将这个空对象的原型指向person的prototype属性;    //上述两步可以合为一步 :  var obj = Object.create(person.prototype)         var res = person.apply(obj, rest);  // 将person的this指向空对象,并运行person函数,apply命令绑定this后就会运行person    return (typeof res === 'object' && res != null) ? res: obj;    // 判断res返回的是不是对象,是的话返res,不是的话返回之前创建的obj,没有返回值默认返回obj}var xiaoming = _new(Person, '小明', 15)console.log(xiaoming .name);  //小明console.log(xiaoming .age);   //15复制代码

本篇如能对您有所帮助,实在是感到荣幸。如有不合理之处也请大家多多指点。

转载于:https://juejin.im/post/5cbbe4dbe51d456e7e297bec

你可能感兴趣的文章
无向图的实现和一些常用算法(一)
查看>>
Node.js 中使用 Redis 来实现定时任务
查看>>
HTTPS抓包
查看>>
Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO
查看>>
spring boot2 整合(一续)Druid数据库连接池和FastJson
查看>>
DevOps中开发的作用和主动性
查看>>
Echarts踩坑记录
查看>>
喧喧发布 2.5.1 版本,支持移动版和桌面端同时登录
查看>>
揭秘:深度网络背后的数学奥秘
查看>>
Android Fragment使用详解
查看>>
SSM+maven实现答题管理系统(三)
查看>>
Python面试题
查看>>
Confluence 6 已经存在的安装配置数据库字符集编码
查看>>
【死磕 Spring】----- IOC 之解析 bean 标签:开启解析进程
查看>>
国内域名如何转入 GoDaddy,域名转入GoDaddy要注意?
查看>>
Java开发之上帝之眼系列教程前言和章节目录汇总
查看>>
隐马尔科夫模型笔记
查看>>
【Android学习】View点击事件的分发机制(一)
查看>>
Laravel Predis Error while reading line from the server.
查看>>
使用Orange Pi Zero做小小服务器(Netdata篇)
查看>>