手写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 ...
随机推荐
- vue之插槽-slot
1.背景 2.slot简单使用 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- Java jdk版本对照表
这里将JDK版本和major.minor的版本的对照关系进行整理,作为今后查阅的依据. 序号 jdk版本 major.minor version 1 1.1 45 2 1.2 46 3 1.3 47 ...
- Python 潮流周刊#65:CSV 有点糟糕(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 第三方软件测评实验室-CNAS
一家获得中国合格评定国家认可委员会CNAS认证资质的第三方软件测评机构,能够提供以下专业服务 1. 登记测试报告:用于政府项目申报.高新认证.创新产品认定.首版次申报.招投标和报奖. 2. 信息系统验 ...
- LogBack 没有打印日志
背景: 某日进行测试,新增了一行日志(项目使用的是logback) 报错: 无,就是不打印日志 解决: 经过仔细查看代码,发现之前的人写代码的时候 在其它类里面,将 private final Log ...
- 使用.NET源生成器(SG)生成项目的版本号信息
之前写过一篇 源生成器生成自动注入的代码 主要是通过SyntaxProvider查找标注特性实现 其实除了SyntaxProvider之外还有几个很重要的Provider,比如:MetadataRef ...
- 使用 nuxi generate 进行预渲染和部署
title: 使用 nuxi generate 进行预渲染和部署 date: 2024/9/4 updated: 2024/9/4 author: cmdragon excerpt: 通过 nuxi ...
- 合合信息通过ISO/IEC国际标准双认证,为全球用户提供高合规标准AI服务
互联网.AI等技术的全球普及为人们提供便捷服务的同时,也带来了信息安全领域的诸多挑战.保护用户隐私及数据安全,是科技企业规范.健康发展的重心.近期,上海合合信息科技股份有限公司(简称"合合信 ...
- Azure – Key Vault Certificate
前言 之前有介绍过读写 Certificate Store, 但在 production server 经常会遇到权限的问题. 为了一劳永逸, 可以考虑把 Certificate 放到 Azure K ...
- 应聘软件测试 HR 会问到哪些问题?收藏这一篇就够了!
1.你还有收到其他offer吗? 其实hr问你offer情况,是对你感兴趣,想要进一步了解你,看下你的市场竞争力. 但注意不要太坦诚的说:我还没有offer或者收到两个offer还想对比对比:也不要撒 ...