JS基础源码之手写模拟new

JS基础源码之手写模拟new

  • 手写模拟new
    • 初步实现
    • 最终实现

手写模拟new

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一。
我们先看看new实现了哪些功能:

function Person (name,age){
	this.name = name;
	this.age = age;
	this.habit = 'Games';
}
Person.prototype.strength = 80;
Person.prototype.sayYourName = function (){
	console.log('I am ', this.name);
}
var person = new Person('kin',18);
console.log(person.name);//kin
console.log(person.habit);//Games
console.log(person.strength);//80
person.sayYourName();// I am kin

我们可以看到,实例person可以:

  1. 访问到Otaku构造函数里的属性;
  2. 访问到Otaku.prototype中的属性;
    接下来,我们可以尝试着模拟一下:
    因为new是关键字,所以无法像bind函数一样直接覆盖,所以我们写一个函数,命名为objectFactory,来模拟new的效果,用的时候是这样的:
function Person(){
	...
}
//使用new
var person = new Person(...);
//使用objectFactory
var person = objectFactory(Person,...)

初步实现

因为new的结果是一个新的对象,所以在模拟实现的时候,我们也要建立一个新对象,假设这个对象叫obj,因为obj会具有Person构造函数里的属性,我们可以使用Person.apply(obj,arguments)来给obj添加新的属性。
然后,实例的proto属性会指向构造函数的prototype,也正是因为建立起这样的关系,实例可以访问原型上的属性。

//第一版代码
function objectFactory(){
	var obj = new Object();
	Constructor = [].shift.call(arguments);
	obj.__proto__ = Constructor.prototype;
	Constructor.apply(obj,arguments);
	return obj;
}

在这一版中,我们:

  1. 用new Object()的方式新建了一个对象obj;
  2. 取出第一个参数,就是我们要传入的构造函数。此外因为shift会修改原数组,所以arguments会被去除第一个参数;
  3. 将obj的原型指向构造函数,这样obj就可以访问到构造函数原型中的属性;
  4. 使用apply,改变构造函数this的指向到新建的对象,这样obj就可以访问到构造函数中的属性;
  5. 返回obj;
    测试下:
function Person (name,age){
	this.name = name;
	this,age = age;
	this,habit = 'Games';
}
Person.prototype.strength = 88;
Person.prototype.sayYourName = function(){
	console.log('I am',this.name);
}
function objectFactory(){
	var obj = new Object();
	Constructor = [].shift.call(arguments);
	obj.__proto__ = Constructor.prototype;
	Constructor.apply(obj,arguments);
	return obj;
};
var person = objectFactory(Person,'kin',17);
console.log(person.name);//kin
console.log(person.habit);//Games
console.log(person.strength);//88
person.sayYourName();// I am kin

最终实现

假如构造函数有返回值

function Person(name,age){
	this.strength = 90;
	this.age = age;
	return {
		name:name,
		habit:'Games'
	}
}
var person = new Person('kin',12);
console.log(person.name);//kin
console.log(person.habit);//Games
console.log(person.strength);//undefined
console.log(person.age);//undefined

在这个案例中,构造函数返回了一个对象,在实例person中只能访问返回的对象中的属性。
而且还要注意一点,在这里我们是返回一个对象,假如我们只是返回一个基本类型的值呢?
我们再看一个例子:

Function Person(name,age){
	this.strength = 60;
	this.age = age;
	return 'handsome boy';
}
var person = new Otaku('kin',12);
console.log(person.name);//undefined
console.log(person.age);//undefined
console.log(person.strength);//60
console.log(person.age);//18

这次尽管有返回值,但是相当于没有对返回值进行处理。
所以我们还需要判断返回的值是不是一个对象,如果是一个对象,我们就返回这个对象,如果没有,我们该返回什么就返回什么。

//最终版的代码
function objectFactory(){
	var obj = new Object();
	Constructor = [].shift.call(arguments);
	obj.__proto__ = Constructor.apply(obj,arguments);
	return typeof ret == 'object' ? ret : obj;
};

本文章可以参考JS基础之原型&原型链一起看,学习效果更佳哟~

好啦!简单的知识点就到这里啦休息一下奖励自己一下!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/240212.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023全国职业院校技能大赛信息安全管理与评估正式赛(模块三CTF)

全国职业院校技能大赛高等职业教育组信息安全管理与评估 \任务书\ 模块三 网络安全渗透、理论技能与职业素养 极安云科专注技能竞赛,包含网络建设与运维和信息安全管理与评估两大赛项,及各大CTF,基于两大赛项提供全面的系统性培训&#xf…

目标检测锚框

目标检测锚框 最开始呢,我们需要先介绍一下框,先学会一下怎么画框 导入所需要的包 from PIL import Image import d2lzh_pytorch as d2l import numpy as np import math import torch展示一下本次实验我们用到的图像,猫狗 d2l.set_figsiz…

智能优化算法应用:基于帝国主义竞争算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于帝国主义竞争算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于帝国主义竞争算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.帝国主义竞争算法4.实验参数设定…

C语言--动态内存【详细解释】

一.动态内存介绍🍗 在C语言中,动态内存分配是指在程序运行时根据需要动态申请内存空间,以便在程序的不同阶段存储和使用数据。动态内存的分配与释放需要一组函数来实现,包括malloc、calloc、realloc和free。 malloc: 函数用于分配…

原创改进|多策略融合的改进蜣螂优化算法

作者在前段时间的一篇文章中介绍过了蜣螂优化算法(dung beetle optimizer,DBO)的原理及实现,该算法是由东华大学沈波教授团队在2022年提出[1],其灵感来自蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为这5种习性,其不同的子种群执行了不…

Unity 射线检测(Raycast)检测图层(LayerMask)的设置

目录 主要内容 拓展: 主要内容 Raycast函数有很多重载(函数的重载根据函数的参数来决定) 这里只涉及这个重载,其余重载可以很方便得在Visual Studio中看源码获取; public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hit…

java实现局域网内视频投屏播放(三)投屏原理

常见投屏方案 常见的投屏方案主要有以下几种: DLNA DLNA的全称是DIGITAL LIVING NETWORK ALLIANCE(数字生活网络联盟)。DLNA委员会已经于2017年1月5日正式解散,原因是旧的标准已经无法满足新设备的发展趋势,DLNA标准将来也不会再更新。但是…

【Android嵌入式开发及实训课程实验】【项目1】 图形界面——计算器项目

【项目1】 图形界面——计算器项目 需求分析界面设计实施1、创建项目2、 界面实现实现代码1.activity_main.xml2.Java代码 - MainActivity.java 3、运行测试 注意点结束~ 需求分析 开发一个简单的计算器项目,该程序只能进行加减乘除运算。要求界面美观,…

排序算法-快速排序

1.快速排序(递归) 快速排序是 Hoare 于 1962 年提出的一种二叉树结构的交换排序方法,其基本思想为: 任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素…

Armv8/Armv9从入门到精通-课程介绍

通知,Arm二期,咱们也有大合集PDF了,共计1587页,还未完成,后续持续更新和优化中。为了方便大家阅读、探讨、做笔记,特意整了此合集PPT,为了增加标签目录,还特意开了福兮阅读器会员。 …

OkHttp: 拦截器和事件监听器

文章目录 1. 拦截器1. 拦截器链2. 实际案例1. 注册为应用拦截器2. 注册为网络拦截器 3. 如何选择用哪种拦截器1. 应用拦截器2. 网络层拦截器3. 重写请求4. 重写响应 4. 可用性 2. 事件监听器1. 请求的生命周期2. EventListener使用案例3. EventListener.Factory4. 调用失败的请…

【产品经理】产品专业化提升路径

产品专业化就是上山寻路,梳理一套作为产品经理的工作方法。本文作者从设计方法、三基座、专业强化、优秀产品拆解、零代码这五个方面,对产品经理的产品专业化进行了总结归纳,一起来看一下吧。 产品专业化就是上山寻路,梳理一套作为…

8 Buildroot 根文件系统构建

一、根文件系统简介 根文件系统一般也叫做 rootfs,这个是属于 Linux 内核的一部分。 根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,…

十六 动手学深度学习v2计算机视觉 ——样式迁移

文章目录 基于CNN的样式迁移 基于CNN的样式迁移 我们通过前向传播(实线箭头方向)计算风格迁移的损失函数,并通过反向传播(虚线箭头方向)迭代模型参数,即不断更新合成图像。 风格迁移常用的损失函数由3部分组…

源码角度简单介绍LinkedList

LinkedList是一种常见的数据结构,但是大多数开发者并不了解其底层实现原理,以至于存在很多误解,在这篇文章中,将带大家一块深入剖析LinkedList的源码,并为你揭露它们背后的真相。首先想几个问题,例如&#…

科技提升安全,基于YOLOv7【tiny/yolov7/yolov7x】开发构建商超扶梯场景下行人安全行为姿态检测识别系统

在商超等人流量较为密集的场景下经常会报道出现一些行人在扶梯上摔倒、受伤等问题,随着AI技术的快速发展与不断普及,越来越多的商超、地铁等场景开始加装专用的安全检测预警系统,核心工作原理即使AI模型与摄像头图像视频流的实时计算&#xf…

头歌——HBase 开发:使用Java操作HBase

第1关:创建表 题目 任务描述 本关任务:使用Java代码在HBase中创建表。 相关知识 为了完成本关任务,你需要掌握:1.如何使用Java连接HBase数据库,2.如何使用Java代码在HBase中创建表。 如何使用Java连接HBase数据库…

网神 SecGate3600 authManageSet.cgi信息泄露漏洞复现

漏洞概述 网神SecGate 3600 authManageSet.cgi 接口存在敏感信息泄露漏洞,未授权得攻击者可以通过此漏洞获取控制台管理员用户名密码等凭据,可登录控制整个后台,使系统处于极不安全的状态 复现环境 FOFA:body"sec_gate_im…

python冒泡排序

冒泡排序思想 大家可以把我们所有的需要排列的数字想象成一个水中的气泡,大的数字想象成大气泡,小的数字想象成小气泡。 其实冒泡排序就是比较相邻的两个数字的大小,然后大的数字排在小的数字的后面,我们依次比较,第一…

“百里挑一”AI原生应用亮相,百度智能云千帆AI加速器首个Demo Day来了!

作者简介: 辭七七,目前大二,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…