遇事不决看源码

ThingsBoard 3.3.0 源码编译完整过程! ThingsBoard3.3.0源码从环境配置到编译完整过程,包括多种常见问题的解决方案! 阅读详情

简介

手撕常用源码为面试中必备的技能,欢迎各位大佬一起探讨指正~

实现一个new源码

首先了解new对实例化构造函数时内部实现了啥:

  1. 创建一个控对象
  2. 将构造函数的原型对象添加到这个对象的隐形属性__proto__
  3. 执行构造函数当函数返回对象的时候,返回对象
  4. 当函数返回非对象的时候返回这个ob j

具体代码实现逻辑如下

// es5写法
function newp(Con,...args){
	const obj = Object.create(Con.prototype);
	const res = Con.apply(obj, args)
	return res instanceof Object ? res : obj
}
// es3
function newP(){
	const obj = new Object();
	const args = Array.prototype.slice.call(arguments, 1);
	const Con = Array.prototype.shift.call(arguments);
	obj.__proto__ = Con.prototype;
	const res = Con.apply(obj, args);
	return res instanceof Object ? res : obj;
}

实现Object.create

上面new的例子在es5的写法中用到了Object.create的写法,因此我们了解到Object.create的作用是创建一个新对象,使用现有的对象作为新创建对象的prototype。:

  1. 先生成一个空对象
  2. 将传入的对象添加到这个对象的隐形属性__proto__中
  3. 最后的生成的对象的原型对象的constructor属性要指向创建的对象

具体代码实现逻辑如下

function create(object){
	const obj = new Object();
	obj.__prototype = object;
	obj.__prototype.constructor = obj;
	return obj
}

实现instanceof

学习过原型链的都知道判断一个对象是否在某个原型链上,以及判别引用类型的方法不能用typeof, 而是instanceof 那么手撕一波:

// 1. 检测构造函数的 prototype 属性是否出现在某个实例对象的原型链
// 2. Object.getPrototypeOf(obj(要返回其原型的对象)) 方法返回指定对象的原型(内部[[Prototype]]属性的值)。
// 3. 返回值:给定对象的原型。L.__proto__.__proto__ 直到 proto 为 null,则返回 null 。
// 4. 函数中的while(true){return} 不会无限循环,当出发return结束循环
function instanceofP(L, R){
	if(typeof(L) !== 'object'){
	  return false
  }
  let l = L.getPrototypeOf(L);
  const r = R.prototype;
  while(l !== null){
	if(l === r){
		return true
	}
	l = l.getPrototypeOf(l)
  }
}

bind实现

bind做了啥

  1. bind是Function原型链中的Function.prototype的一个属性,
  2. 它是一个函数,修改this指向,合并参数传递给原函数,返回值是一个新的函数。
  3. bind返回的函数, 可以通过new调用,返回原函数的实例,但是不改变this指向
  4. 指向了new生成的全新对象。内部模拟实现了new操作符。
/* eslint-disable no-extend-native */
Function.prototype.bind3 = function () {
  if (!(this instanceof Function)) {
    throw new Error('is not a function');
  }
  const func = this;
  const args = Array.prototype.slice.call(arguments, 1);
  const Content = Array.prototype.shift.call(arguments);

  return function F() {
    const argp = Array.prototype.slice.call(arguments);
    const Arg = args.concat(argp);
    const selfp = this;
    // this instanceof f   正常情况下这种情况返回的是纯粹函数,this指向的是全局当用new时this指向的时F, 否则指向的原来的构造函数的原型对象
    if (selfp.__proto__ === F.prototype) {
      return new func(...Arg);
    }
    return func.apply(Content, Arg);
  };
};

call实现

call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。这是也是利用函数this指向对象的套路同apply

// 参数你也可以指定(self, ... agrs)我这里用arguments只是单纯为了装b
Function.prototype.callp = function () {
  // 这里还是我想玩一下原型链的骚操作
  // 可以用!(this.instanceof Function),或者typeof(this) === 'function
  if (this.__proto__ !== Function.prototype) {
    throw new Error('is not function');
  }
  const args = Array.prototype.slice.call(arguments, 1);
  const content = this;
  // 为什么用shift, 问就是为了装b
  const self = Array.prototype.shift.call(arguments) || {};
  self.fuc = content;
  const res = self.fuc(...args);
  // 这里一定要记的删掉this中添加的函数属性
  delete self.fuc;
  return res;
};

apply实现

apply() 方法调用一个具有给定this值的函数,以及以一个数组(或类数组对象)提供的参数, 返回修改this指向的函数结果, 利用this指向(obj)特性实现apply源码

/* eslint-disable no-extend-native */
// apply改变函数this指向, 返回改变指向的函数的结果
Function.prototype.applyp = function (self, args) {
  if (!(this instanceof Function)) {
    throw new Error('is not function');
  }
  const content = this;
  const selfp = self || {};
  selfp.content = content;
  const res = self.content(...args);
  // 一定要将添加到修改函数this指向中的函数去掉
  delete self.content;
  return res;
};

结束语

如果各位大佬觉得还不错请给个素质3连,欢迎各位大佬提出更好的写法~

微信小程序--加密MD5与base64 引入MD5或者base64 对于第一次在小程序上用的时候,感觉很慌很蒙蔽,不过如果有过vue,react或者其他开发基础的其实应该会很快适应过来,因为你可以直接npm i把源码下下来,然后引入就ok了; 相对于遇事不决找百度、bing、谷歌,在网上找的其实很多并不是很完整,缺三少两的,要不就是不支持中文,要么就是不支持图片,用源码的话就完全没这问题了,除非源码对于这块也没有相关支持或处理。。。 ... 阅读详情

相关推荐

【QT】简易小六壬起卦器 遇事不决 六壬决断

整点有意思的,用qt写了个简易小六壬起卦器。心血来潮时获取当时起卦结果。不多说,直接上源码。

weixin_45397344的博客 927

Bugku web 计算器

计算器 打开网页,想输入正确的计算结果发现只输进去一位数??? 遇事不决先F12看一眼源码,发现flag 转载于:https://www.cnblogs.com/agenthtb/p/10460914.html...

dddddd12345456的博客 283

content-pipeline:一条可落地的内容生产流水线

content-pipeline 是一种将内容创作工程化的系统性方法,其核心在于用确定性流程替代碎片化人工操作。它基于结构化提示(prompt)、预置叙事框架与品牌参数固化三大原理,实现从素材输入到多平台发布的端到端自动化。技术价值体现在显著降低认知负荷、保障输出一致性、支持本地化资源绑定与闭环反馈校验。典型应用场景包括技术教程批量生成、跨平台(公众号/小红书/即刻)内容适配、AI写作质量可控迭代等。本文深入解析其作为‘内容制造业’基础设施的底层设计逻辑与实操路径,尤其聚焦Claude Code环境下的真实

weixin_31199559的博客 270

联手 AI 给 Vue 和 Vite 贡献源码,我学到了什么?

在本次联手AI参与开源的冒险中,AI可以解释源码,还在类型参考和生成测试等方面初露锋芒,降低了开源贡献的心智负担。此外,提交之前除了功能测试,最好利用Vitest源码依赖的tinybench或在线工具测试性能,这样开源团队才能理解你的贡献意图。开源经验方面,如果是新项目,JS微观性能重构是可接受的,我发现Vue/Vite源码早期的提交中就合并了这种优化,甚至现在的Vitest源码就采用了两种不同方案封装。但如果你想给稳定的开源项目贡献源码,不建议纠结JS的微观性能。

weixiao92626的博客 671

浅谈MOS管的发热原因和解决办法

解读一下开关管发热原因,解决方案和开关损耗测试。

qq_45508321的博客 1万+

Python实战:打造学生信息管理系统

通过本教程,我们构建了一个简单的学生信息管理系统,实现了基本的添加、删除、修改和查询功能。当然,这个系统还有很多可以改进和扩展的地方,比如添加用户界面、增加数据持久化功能、支持批量操作等。简介:本文将介绍如何使用Python编写一个功能齐全的学生信息管理系统,包括添加、删除、修改和查询学生信息的基本操作。学生信息管理系统是学校日常管理中不可或缺的一部分,它能够帮助管理人员快速、准确地管理学生信息,提高工作效率。为了实现上述功能,我们可以设计一个包含学生信息的字典,并使用函数来封装各个操作。

铭渊老黄 1492

如何对AutoGen Studio本地源码构建?

先给大家分享一下《剑来》中的一些经典台词:遇事不决,可问春风。春风不语,既随本心,本心不明,可问大风,大风不语,勾栏听曲 🎶🌄世间唯有痴情,不容他人取笑 💔言念君子,温其如玉。🌸🌏某些人和事,哪怕是路边的风景,可是只要看一眼,依然会让人觉得很美好。💪混吃等死,小富即安,飞黄腾达,是因为各有各的缘法,未必有高下之分。🌄修心,亦是修行之一。顺境修力,逆境修心,缺一不可。💪君子坐而论道,少年起而行之。📚我想变成一棵树,开心时,在秋天开花;伤心时,在春天落叶。🌳。

收破烂的小熊猫 702

ABB机器人刷功能选项全一篇就够——不怕丢失程序和IO配置数据

ABB机器人刷功能选项

m0_66701835的博客 1260

【优质资源】2023年Android开发源码手册,最新整理

在 Android开发中,每个工程师都或多或少会接触到源码,也都非常清楚源码的重要性。源码阅读是每个程序员都需要掌握的核心技能,如果你已经有3、5年的开发经验,还遇事不决上百度,读不懂源码,更不会写源码的话,那就有点说不过去了。 国内移动互联网红利期已过,Android 开发从最初的一人难求,到后来的一个岗位百人竞投,僧多粥少的情况直接导致整个行业对求职者的要求越来越高。所以,我们只有不断提升自己的技术实力,让自己进阶为高工,才有机会爬上 Android 的顶峰。

大模型学习路线 417

Mac mini M2 部署 OpenClaw:最稳 7×24 本地 AI 服务器

Mac mini M2 凭借其强大的 M2 芯片、低功耗和静音特性,成为部署 OpenClaw AI 服务器的理想平台。本文详细介绍了从系统配置到 OpenClaw 部署的全过程,包括 Docker 环境搭建、docker-compose 编排、性能优化方案以及开机自启设置。通过统一内存架构和高效 SSD,M2 版 Mac mini 在 AI 推理速度上显著优于前代产品,同时保持极低的功耗(仅 8W),适合 7×24 小时稳定运行。部署方案充分利用了容器化技术,确保了服务的可靠性和可维护性。

一键难忘的博客 2954

024、反激变换器的短路保护设计

本文详细探讨了反激变换器短路保护的设计要点与实践经验。作者通过实际案例分析了短路时反激拓扑的电流特性,指出初级峰值电流限制是最基础的保护手段,但需配合打嗝模式使用。文章重点剖析了打嗝模式设计的三个关键陷阱:频率设定、退出条件和软启动衔接。同时强调次级侧辅助保护、变压器参数优化、环路响应协调的重要性,并比较了自恢复与锁死方案的适用场景。最后提出实测验证的四个关键点和设计经验:不盲信芯片手册、保护电路独立设计、充分留有余量、进行破坏性测试。全文以工程实践为导向,为反激电源的可靠短路保护提供了系统性解决方案。

Jack010169的博客 244

MultipartFile transferTo 发生异常,提示临时文件不存在

事情是这样的,当我多次调用了两次transferTo转储到本地磁盘时,遇到了报错/T/tomcat.xxx/work/Tomcat/localhost/ROOT/upload_eb3c7c46_060c_4247_86c0_9ae0ce59943b_00000000.tmp (No such file or directory)这里可以看出来,首先接口接收到MultipartFile 文件时,会自动在临时目录创建临时文件,transferTo 实际上是将临时文件rename。创建文件,然后写入这个文件。

weixin_43935720的博客 346

YOLOv13涨点改进 | 全网独家创新、HyperACE改进、注意力改进篇 | CVPR 2025| 引入LRSA局部区域自注意力模块,能提升其在细节捕捉、小目标检测和长距离依赖建模方面的能力

本文提出将LRSA(局部区域自注意力)模块集成到YOLOv13中,通过局部特征交互增强细节捕捉能力、小物体检测精度和长距离依赖建模。LRSA模块采用重叠图像块处理策略,在保持计算效率的同时提升复杂背景下的检测性能。文章详细介绍了模块结构、原理优势,并提供了三种改进方案:1)在主干网络添加LRSA层;2)将关键模块替换为DSC3k2_LRSA;3)采用HyperACE_LRSA结构。配套提供了完整的PyTorch实现代码和YAML配置文件,展示了该模块如何通过局部注意力机制平衡检测精度与推理速度。

Ai缝合怪、助力小伙伴高效发论文 345

ceres中的ConditionedCostFuntion源码阅读

ceres中的ConditionedCostFuntion源码阅读 class ConditionedCostFuntion 这个类的作用是给隐藏代价函数(cost function)的残差值赋上不同的权值。举个简单的例子:你有一个产生了N个残差值的代价函数,但是你想要残差的总体值不是简单的等于每个参加的平方和,你想给每一个残差一个特定的权值(尺度),来改变每个残差对总体参加的贡献。 // my...

卫少东个人博客 586

电机瞬态分析基础(2):理想电机的基本假设和正方向规定

电机瞬态分析基础之理想电机假设条件和正方向规定

weixin_45670943的博客 1146

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

三年之久的 etcd 3 数据不一致 bug 分析

etcd 作为 Kubernetes 集群的元数据存储,是被业界广泛使用的强一致性 KV 存储,但近日被挖掘出一个存在 3 年之久的数据不一致 bug——client 写入后无法在异常节...

Docker的专栏 1126

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

这些解决 Bug 的套路,你都会了不?

最近整理了我原创的 140 篇编程经验和技术文章,欢迎大家阅读,一起成长!指路:https://t.1yb.co/ARnD 大家好,我是鱼皮。 学编程的过程中,我们会遇到各式各样的 Bug,也常常因为它们而感到头秃。 但随着你不断解决 Bug、积累经验,就会发现其实解决 Bug 也是有套路的。 今天分享下鱼皮自己总结的解决 Bug 套路,帮助大家提高编程学习效率,保护头发。 解决 Bug 套路总结 本文大纲: 准备工作 其实改 Bug 的过程就跟破案是一样的。 首先,在急着去搜索问题、上手写代码改 .

努力做最接地气的编程干货分享,感谢关注 1805

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

三年之久的 etcd3 数据不一致 bug 分析

etcd 作为 Kubernetes 集群的元数据存储,是被业界广泛使用的强一致性 KV 存储,但近日被挖掘出一个存在 3 年之久的数据不一致 bug——client 写入后无法在异常节...

腾讯技术工程 1145

Hotspot源码解析-第28章-终结篇章

Hotspot源码解析;JVM源码解析;Java虚拟机源码解析

zhang527294844的博客 1012

遇事不慌-手撸一个Vue-markdown-loader!

Created By JishuBao on 2019-04-22 12:38:22 Recently revised in 2019-04-23 20:59   欢迎大家来到技术宝的掘金世界,您的star是我写文章最大的动力!GitHub地址          最近新公司在制定一套UI规范,说是为了以后前端“即托即用”做准备。      本来前端人数就不多的我和我的小郝哥开始抓紧了节奏,...

weixin_34072159的博客 1076

微服务中 Seata “分支事务不回滚”问题的复盘

这个问题还是围绕 Seata 分布式事务处理中“全局事务的开启与处理”和“xid的产生与传递”这两个知识。从前一天下午发现这个问题,然后没处理掉。晚上十一点继续处理这个问题,折腾到第二天凌晨四点左右才处理和验证完成。其实一开始就进入了误区

Enchanter06的博客 5264

InnoDB 啥时候不执行事务?

一、背景 最近看到技术群里,有朋友提的一个问题很有意思,值得简单探讨下。 因此简单整理下,希望对大家有帮助。 该同学的回答是 “配置禁用事务”。 还有些同学说,可以“关闭 undo log 和 redo log”。 大家对这个问题怎么看呢? 注: 以下只是自己的理解,可能会有纰漏,如果有不同意见,欢迎评论探讨。 二、探讨 第一印象,Spring 里不启用事务相关的功能,如不使用 @Transaction 注解或者不使用编程式事务的方式不就好了吗? 因为平时我们开发的时候,“需要保证数据库操作的原子性时

悟鸣的技术博客 783

源码解读Spring-Security之初始化启动

基于 SpringBoot2.4.2 + Spring-Security5.4.2。鉴于最近两年使用到的技术栈中Spring的权重越来越高,加之近期所参与的一个项目需求,遂决定加深以下对于Spring-Security的理解,做到"胸有成竹,遇事不慌"。

夫礼者的专栏 495

【配置】Ubuntu、ROS 、moveit源码安装及开发环境配置

Ubuntu 华硕主板关闭secure boot 没有WiFi驱动

vrijheid的博客 2366

【看源码学知识】uniapp

uniapp最新版中有vite插件能动态生成page.json,这样省事很多,不用每次在分包内加页面都得再去路由添加。但已有小程序项目中,有不少是vue2项目,无法使用vite打包,所以打算看看uniapp源码,想看看如何让vue2项目也能自动生成page.json在打算瞎看一通时,发现了一个另类写法这乍一看好像能理解,传参并调了一个函数,但怎么都没写function,()+()就行了???

qq_39899216的博客 464

【源码笔记】痛苦来源于比较——什么是相等,hashCode() 和 equals(Object)

浅谈Java的hashCode和equals方法

weixin_43686024的博客 153
上一篇: node高并发原理机制
下一篇: 手撕redis单实例分布式锁(node)
蛮吉(lambda)
博客等级 码龄7年 2粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值