new一个实例的原理及过程
前提,要明白new出来的实例是什么,包含了哪些内容?
请看一下举例代码↓↓↓↓
function Person(name,age){
this.name = name;
this.age = age;
}
let p =new Person('pxx',18);
console.log(p);
// 控制台打印
Person {name: "pxx", age: 18}
age: 18
name: "pxx"
__proto__:
constructor: ƒ Person(name,age)
__proto__: Object
从上面例子可以得出以下结论:
- new出来的是一个对象
- 对象上有一个__proto__属性,值为Person的原型
- 同时对象上还有构造函数执行的属性
但是还有一点上面例子没有体现,就是假如构造函数本身返回的就是一个对象时的情况,我们稍加改造↓↓↓↓
1.返回值是基本数据类型
function Person(name,age){
this.name = name;
this.age = age;
return 'test'
}
let p =new Person('pxx',18);
console.log(p);
// 控制台打印内容
Person {name: "pxx", age: 18}
age: 18
name: "pxx"
__proto__: Object
2.返回值是对象
function Person(name,age){
this.name = name;
this.age = age;
return {
name: 'other',
age: 20
}
}
let p =new Person('pxx',18);
console.log(p);
// 控制台打印如下
{name: "other", age: 20}
age: 20
name: "other"
__proto__: Object
可以看出,当构造函数返回的是一个对象时,new出来的实例就是函数的返回值。
通过以上分析,我们可以按步骤写出自己的一个new方法
具体步骤如下:
- 建立一个空对象
- 为空对象添加__proto__属性
- 在空对象上执行构造函数
- 判断合法返回值
最终源码如下↓↓↓↓↓↓↓↓↓↓↓↓
function myNew(Fn,...args){
// 1.新建空对象
let o = {};
// 2.对象的__proto__ 属性指向原型
o.__proto__ = Fn.prototype;
// 3.以对象为this,执行构造函数
let res = Fn.apply(o,args);
// 4.返回合法值
return res instanceof Object? res : o;
}
let p1 = myNew(Person,'pxx',18);
console.log(p1);
new一个实例的原理及过程的更多相关文章
- Servlet实现前后端交互的原理及过程解析
在日常调试项目时,总是利用tomcat去启动项目,并进行前后端联调,但对于前后端的请求响应的交互原理及过程并不是特别清晰. 为什么在前端发出相应请求,就能跳转到后端通过程序得到结果再响应到前端页面呢? ...
- 阿里面试官:Android中binder机制的实现原理及过程?
Binder 是 Android 系统中非常重要的组成部分.Android 系统中的许多功能建立在 Binder 机制之上.在这篇文章中,我们会对 Android 中的 Binder 在系统架构中的作 ...
- Synchronized锁升级原理与过程深入剖析
Synchronized锁升级原理与过程深入剖析 前言 在上篇文章深入学习Synchronized各种使用方法当中我们仔细介绍了在各种情况下该如何使用synchronized关键字.因为在我们写的程序 ...
- Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序
先看一道Java面试题: public class Baset { private String baseName = "base"; // 构造方法 public Baset() ...
- AJAX异步请求原理和过程
AJAX 指异步 JavaScript 及 XML(Asynchronous JavaScript And XML),它不是一种新的编程语言,而是一种使用现有标准的新方法. AJAX 基于 JavaS ...
- 苹果公司的新的编程语言 Swift 高级语言(十一)--初始化类的析构函数的一个实例
一 .实例的初始化 实例的初始化是准备一个类.结构或枚举的实例以便使用的过程. 初始化包含设置一个实例的每个存储属性为一个初始值,以及运行不论什么其他新的实例可以使用之前须要的设置或 ...
- vue.js+webpack在一个简单实例中的使用过程demo
这里主要记录vue.js+webpack在一个简单实例中的使用过程 说明:本次搭建基于Win 7平台 Node.js 安装官网提供了支持多种平台的的LTS版本下载,我们根据需要来进行下载安装.对于Wi ...
- vc++高级班之窗口篇[4]---让程序只运行一个实例
大家都看过或者使用过类似只运行一个实例的程序,比如:QQ游戏.部分浏览器 等等! 让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建后,有窗口的程序在窗口创建前, 检查系统中是 ...
- python 单例模式,一个类只能生成唯一的一个实例,重写__new__方法详解
单例:一个类只能生成唯一的一个实例 每个类只要被实例化了,他的私有属性 '_instance'就会被赋值,这样理解对吗 对 #方法1,实现__new__方法 #并在将一个类的实例绑定到类变量_inst ...
- Sql Server tempdb原理-启动过程解析实践
我们知道在SqlServer实例启动过程中数据库会进行还原(Redo,Undo)然后打开提供服务,但我们知道tempdb是不提供重做机制的(Redo)那tempdb是如何还原的呢?如果tempdb损坏 ...
随机推荐
- SVD动态图
library(gganimate) library(gifski) # 构造数据 phi<-pi/6 theta<-pi/3 c<-matrix(c(cos(phi),sin(ph ...
- vue-awesome-swiper使用中的一些问题
项目中使用了vue-awesome-swiper,发现autoplay不能用.网上找了半天,说是版本问题.最后在main.js中添加以下代码解决. import VueAwesomeSwiper fr ...
- 【Python3+Selenium】基本操作
一.环境准备 1.Selenium安装教程 1.1 打开cmd,输入如下命令:pip/pip3 install selenium 1.2 安装完成后查看Python路径包管理(Lib\site-pac ...
- 【Python】变量&数据类型&运算符
一.Python变量&数据类型&运算符 1.print()函数 1.1 输出数字,字符串,含有运算符的表达式 print(123) print('hello world') print ...
- ResponseUtil 请求返回
package com.infosec.sso.common; import java.io.IOException; import java.util.HashMap; import java.ut ...
- python实现图片转PDF
import os from PIL import Image from reportlab.pdfgen import canvas def image_resize(img, width, hei ...
- host头攻击
一.问题源起 HTTP1.1规范中在增加了HOST头信息,用于存储服务端与客户端的路由信息. 例如: Request的Header里就有一个标名请求,它是用来记录服务端网站域名的. 如果前端或者后台正 ...
- IDEA打包普通java项目并用java命令运行
IDEA下打包为jar包,普通java项目(非web项目) 效果是将第三方jar包放到一个文件夹中(如lib),这样看起来清晰一些.如下图这种: 1.项目结构. 1.关键:modules 在<o ...
- 【Java】List
对List中map集合中某个字段排序 升序排列 方法1 Collections.sort(maps, new Comparator<Map<String, Object>>() ...
- holiday08
第八天 管道 linux允许将 一个命令的输出 可以 通过管道 作为 另一个命令的输入 ls -lh | more 可以理解现实生活中的管子,管子一头塞东西进去,另一头取出来,这里 | 的左右分为两端 ...