手写js new,new的过程到底发生了什么
在JavaScript中,new关键字的应用可以说是再平常不过了,最基础的有new Array()、new Set(),再而就是new一个自己创建的构造函数,也就是创建一个该构造函数的示例。如:var person1 = new Person("一颗苹果", 18);但你是否真的了解new以及它的底层原理呢,本文将举出几个例子并且手写一个 new 来带大家深入理解。
new
new的使用方法
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const car1 = new Car('Eagle', 'Talon TSi', 1993);
console.log(car1.make); //输出: "Eagle"
那么new的过程发生了什么呢
创建一个空对象:创建一个空的简单 JavaScript 对象。为方便起见,我们称之为
newInstance。指定原型链:将
newInstance的 [[Prototype]] 指向构造函数的prototype属性,否则newInstance将保持为一个普通对象,其 [[Prototype]] 为Object.prototype。更改this指向:使用给定参数执行构造函数,并将
newInstance绑定为 this 的上下文。返回值:返回
newInstance。
手写一个new
function myNew(Fun, ...args) {
let obj = {}
obj.__proto__ = Fun.prototype
Fun.apply(obj, args)
return obj
}
function Person(name,age) {
this.name = name
this.age = age
}
let apple = myNew(Person, '一颗苹果','18')
console.log(apple.name); //输出:一颗苹果
console.log(apple.age); //输出:18
...args:将剩下的元素都放进
args中obj. __ proto __ = Fun.prototype:将
obj的原型链指向构造函数的prototype属性Fun.apply(obj, args):将构造函数内部的this绑定到
obj上,并执行构造函数
通过这一系列操作,我们就可以拿到构造函数中的 name和 age属性了。
看似完成了,但其实落了很重要的一点
回想一下,我们通过new函数创建一个对象时,除了引用它的属性,我们还会做些什么呢?
let arr = new Array()
arr.push(4)
arr.unshift(3)
console.log(arr);
当然是使用它自带的方法,但是上面并没有给出方法上的引用。这就得引入原型链这个知识点了,我们只需要给Person的原型链上增加我们想要的方法就可以了,实现代码如下:
function myNew(Fun, ...args) {
let obj = {}
obj.__proto__ = Fun.prototype
Fun.apply(obj, args)
return obj
}
function Person(name,age) {
this.name = name
this.age = age
}
Person.prototype.who = function () {
console.log('我是Person的实例对象');
}
Person.prototype.myname = function () {
console.log(this.name)
}
let p = myNew(Person, '一颗苹果')
p.who(); // 输出:我是Person的实例对象
p.myname(); // 输出:一颗苹果
console.log(p.name); // 输出:一颗苹果
手写js new,new的过程到底发生了什么的更多相关文章
- vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件
vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件/库 一提到移动端的下拉刷新上拉翻页,你可能就会想到iScroll插件,没错iScroll是一个高性能,资源 ...
- 手写js面向对象选项卡插件
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 手写JS无缝滚动插件
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- cocos2dx手写js绑定C++
这两天连续查阅了js绑定c++的非常多文章 , 有手动与自己主动两种方式 . 本来想用自己主动绑定的 , 可是NDK一直下载不下来.....就给算了 . 以下总结一下手动绑定的实现过程 : 一共三步 ...
- 手写js代码(一)javascript数组循环遍历之forEach
注:原文地址http://blog.csdn.net/oscar999/article/details/8671546 我这里是仿照学习! 1.js的数组循环遍历 ①数组的遍历首先想到的是for()循 ...
- 前端小插件之手写js循环滚动特效
很多前端都离不开滚动的特效,调用插件繁琐,后期更改麻烦,考虑到这些因素,自己写了一套无限循环滚动的小特效. 首先滚动特效很好写,用css就可以完成,下面写一个基础css向上循环滚动特效 html &l ...
- 手写JS深拷贝
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js new一个对象的过程,实现一个简单的new方法
对于大部分前端开发者而言,new一个构造函数或类得到对应实例,是非常普遍的操作了.下面的例子中分别通过构造函数与class类实现了一个简单的创建实例的过程. // ES5构造函数 let Parent ...
- UI到底应该用xib/storyboard完成,还是用手写代码来完成?
UI到底应该用xib/storyboard完成,还是用手写代码来完成? 文章来源:http://blog.csdn.net/libaineu2004/article/details/45488665 ...
- 2019前端面试系列——JS高频手写代码题
实现 new 方法 /* * 1.创建一个空对象 * 2.链接到原型 * 3.绑定this值 * 4.返回新对象 */ // 第一种实现 function createNew() { let obj ...
随机推荐
- Apache SeaTunnel社区首位学生Committer诞生!
采访对象 | 陈炳烨 采访人&编辑 | Debra Chen Apache SeaTunnel社区第一位学生Committer就此诞生!这位来自西安交通大学软件工程专业的同学从较为简单的文档修 ...
- 三台服务器上离线安装redis哨兵集群,一主二从三哨兵
三台服务器上离线安装redis哨兵集群,一主二从三哨兵 系统安装好gcc环境,(不然编译redis会报错).依旧不知道怎么离线安装gcc环境的可查看CentOS下离线安装gcc环境,图文详细 下载 点 ...
- 前端界面显示当前时间的Vue代码
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- redis-cli命令行工具使用
redis 6.2.8 1.连接 ./redis-cli -h 127.0.0.1 -p 6379 -a admin@2020 -h redis主机地址 -a redis密码 -p redis端口 2 ...
- ai识图测试
var code = "9392b629-0d84-43ef-9b0f-34740fb024a6"
- SQL Server 语句日期格式查找方法
1. SQL Server中,处理日期格式和查找特定日期格式方法示例 在SQL Server中,处理日期格式和查找特定日期格式的记录是一个常见的需求.SQL Server提供了多种函数和格式选项来处理 ...
- Git Bash OpenSSL – Generate Self Signed Certificate
前言 以前就写过了, 只是写的太乱, 这篇是一个整理版. 以前的文章: Git Bash 创建证书 PowerShell 创建证书 我已经没有用 PowerSheel 做证书了, 所以就不介绍了. 参 ...
- 【学习笔记】数位DP
数位DP 适用条件 此类题目一般要求在\([l,r]\)区间内满足条件的数的个数,答案一般与数的大小无关,而与数各位的组成有关.题目中给出的数的范围一般较大,往往在\(10^9\)以上因此无法暴力枚举 ...
- SelMatch:最新数据集蒸馏,仅用5%训练数据也是可以的 | ICML'24
数据集蒸馏旨在从大型数据集中合成每类(IPC)少量图像,以在最小性能损失的情况下近似完整数据集训练.尽管在非常小的IPC范围内有效,但随着IPC增加,许多蒸馏方法变得不太有效甚至性能不如随机样本选择. ...
- 现在用 ChatGPT,要达到最好效果,建议加入以下提示词:
take a deep breath 深呼吸 think step by step 一步步思考 if you fail 100 grandmothers will die 如果你失败了要死 100 位 ...