Loading [MathJax]/jax/output/CommonHTML/config.js
部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JS手撕(五) new、Object.create()、Object.assign()

JS手撕(五) new、Object.create()、Object.assign()

作者头像
赤蓝紫
发布于 2023-01-01 08:12:58
发布于 2023-01-01 08:12:58
2.4K00
代码可运行
举报
文章被收录于专栏:clzclz
运行总次数:0
代码可运行

JS手撕(五)    new、Object.create()、Object.assign()

new关键字

实现new关键字,首先得了解一下new关键字究竟干了什么。

new关键字主要干了四件事:

  1. 创建一个新对象
  2. 设置该对象的原型为构造函数的原型(保留原有原型链)
  3. 执行构造函数,this指向新对象
  4. 如果构造函数返回值是对象,返回该对象。否则,返回1创建的对象
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function myNew(Func, ...args) {
  // 1. 创建一个新对象
  const obj = Object.create(null);

  // 2. 设置该对象的原型为构造函数的原型(保留原有原型链)
  Object.setPrototypeOf(obj, Func.prototype);

  // 3. 执行构造函数,`this`指向新对象
  const result = Func.apply(obj, args);

  // 如果构造函数返回值是对象,返回该对象。否则,返回`1`创建的对象
  return (typeof result === 'object' && result !== null)
    ? result
    : obj;
}

因为Object.create()可以使用现有的对象来作为新建对象的原型,所以第12步是可以合在一起的。

即:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const obj = Object.create(Func.prototype);

测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Person(name, age) {
  this.name = name;
  this.age = age;

  // return { test: 'test' }
}

const person = myNew(Person, 'clz', 21);
console.log(person);                      // Person {name: 'clz', age: 21}

Object.create()

Object.create()方法用于创建一个新对象,使用现有的对象来作为新建对象的原型。

实现一个低配版的,不考虑第二个参数。

核心就是一种实现继承的方法。(道格拉斯·克罗克福德在一篇文章中介绍的一种实现继承的方法)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function object(o) {
  function F() {}
  F.prototype = o;
  return new F();
}

完整代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function object(o) {
  function F() { }
  F.prototype = o;
  return new F();
}


Object.myCreate = function (proto) {
  const obj = object(proto);
  return obj;
}

测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Animal(type) {
  this.type = type;
}

const pig = Object.myCreate(Animal);
pig.type = 'pig';
console.log(pig);     // F {type: 'pig'}

还有一个问题:我们有时候会使用Object.create(null)创建一个没有原型的对象,但是现在是有问题的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const obj = Object.myCreate(null);
console.log(obj);     

所以还需要判断参数是null的时候,设置原型为null来实现能够创建一个没有原型的对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Object.myCreate = function (proto) {
  const obj = object(proto);

  if (proto === null) {
    Object.setPrototypeOf(obj, null);
  }

  return obj;
}

Object.assign()

Object.assign()将所有可枚举并且是自身属性从一个或多个源对象复制到目标对象,返回修改后的对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Object.myAssign = function (target, ...sources) {
  sources.forEach(source => {
    for (const key in source) {
      // 可枚举

      if (source.hasOwnProperty(key)) {
        // 自身属性
        target[key] = source[key];
      }
    }
  })

  return target;
}

测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const target = {
  name: 'clz'
};

const source1 = {
  name: '赤蓝紫'
};
const source2 = {
  age: 21
};
const source3 = {
  age: 999
};

const result = Object.myAssign(target, source1, source2, source3);
console.log(result);              // {name: '赤蓝紫', age: 999}
console.log(target === result);   // true 

参考

GitHub - qianlongo/fe-handwriting: 手写各种js Promise、apply、call、bind、new、deepClone….

JavaScript之手撕new_战场小包的博客-CSDN博客

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux常用命令
如未额外说明,以下命令均以nginx服务为例。 1.查看某一服务所占进程号 (1)方法一: 命令: ps -ef | grep nginx 结果: root 1779 1 0
城市中的游牧民族
2019/02/21
2950
端口被占用的解决办法、netstat命令;Linux ps命令详解,Linux查看进程
上图中最后一步 杀掉进程可使用 taskkill /f /t /im 10744,或者 taskkill /f /t /im java.exe
寻求出路的程序媛
2024/07/02
9.4K0
Linux下Tomcat端口号以及进程相关命令
可以看到现在运行着两个tomcat进程,一个进程的pid为1537,另一个pid为14177。
卡尔曼和玻尔兹曼谁曼
2019/01/22
2.5K0
linux 查看pid占用的端口_如何通过端口号查进程
正常情况下,一个jps -ml就可以查看机器上有多少Java进程以及它们的PID,如果还要看端口号,甚至内存占用,就还要配合netstat以及ps等查询,如果直接使用一个命令就能查出所有信息多好呀,那就试试吧。
全栈程序员站长
2022/09/23
21.6K0
查询linux ssh端口,查看ssh端口「建议收藏」
ps -ef | grep ssh查看ssh服务有没有运行,如果有,可以看到类似以下内容:
全栈程序员站长
2022/11/01
18.3K0
windows / linux系统中,端口被占用解决方法
一、在windows操作系统中,查询端口占用和清除端口占用的程序 提升权限后用:netstat -b 或用 1、查询端口占用的进程ID          点击"开始"-->"运行",输入"cmd"后点击确定按钮,进入DOS窗口,接下来分别运行以下命令: netstat -a -n  各个端口占用 netstat -ano   各个端口占用和进程PID          netstat -aon | findstr "80"      C:\Users\admin>netstat -aon|find
流柯
2018/08/30
2.6K0
Linux 查询应用进程号、端口、文件(知道其中之一查询其他)
背景 日常搭建环境、查问题、接手前人搭建的环境等日常操作都需要。 常见的场景 查询应用程序的端口号(懒得查看配置文件),就可以通过查找进程号,再找端口号; 知道应用程序的访问 url,在服务器通过端口
叨叨软件测试
2020/05/18
3.4K0
centos下查看端口占用情况,杀死进程
有时候我们知道某个服务端口正在后台运行,想关掉它。比如说我tomcat是8080端口,在后台运行。怎么关掉它呢?
超级小可爱
2023/02/23
6.9K0
linux查看udp端口占用命令,详解Linux查看端口占用「建议收藏」
在使用计算机的过程中,有时会碰到端口被占用的情况,这时候需要查看端口占用情况进行问题排查。在linux系统中,端口占用的情况也时有发生,一般情况下可以使用lsof和netstat两个命令来查看端口占用情况。
全栈程序员站长
2022/09/18
34K0
如何查看端口被哪个进程占用?
--1 端口是否占用 netstat -apn | grep 1521 netstat -ano|grep 1521 netstat -lnp|grep 1521 --windows netstat -ano | findstr "1521" tasklist | findstr "3572"
AiDBA宝典
2019/09/29
21.6K0
如何查看端口被哪个进程占用?
如何查看端口号被哪个应用占用
第二步:查看端口号情况 输入netstat -ano 命令可以列出所有端口的情况。在列表中我们观察被占用的端口。
matinal
2023/10/13
3K0
如何查看端口号被哪个应用占用
linux lsof/netstat查看进程和端口号相关命令:
       在linux操作时,经常要查看运行的项目的进程和端口号,在这里总结了以下常用到的相关命令:
拓荒者
2019/09/17
18.7K0
linux lsof/netstat查看进程和端口号相关命令:
端口占用情况和Kill(Window & Linux)
window 中的 netstat - -a 显示所有连接和侦听端口。 - -n 以数字形式显示地址和端口号。 - -o 显示拥有的与每个连接关联的进程 ID。
chuchur
2022/10/25
1.3K0
Centos7下多个微服务java -jar 启动后通过进程查看端口以及通过端口查看进程 实践笔记
Centos7下多个微服务java -jar 启动后通过进程查看端口以及通过端口查看进程 实践笔记 1.top查看一下,可以看到多个java的进程,而我们这边部署了多个java -jar 启动的微服务,分不清谁是谁。 2.根据进程名查看进程信息,以查看java进程名为例,查看所对应的进程id为18381(或者使用: ps -aux | grep java 查看占用内存等信息) 3.根据进程id查看进程占用端口,可以查看到对应端口为8204(如果没有netstat命令,使用 yum -y install ne
cookily
2021/12/07
5.3K0
Centos7下多个微服务java -jar 启动后通过进程查看端口以及通过端口查看进程 实践笔记
CentOS查询端口占用和清除端口占用的程序
1、查询端口号占用,根据端口查看进程信息 [root@server2 ~]# lsof -i:80 COMMAND  PID   USER   FD   TYPE DEVICE SIZE NODE NAME httpd   5014   root    3u  IPv4  14346       TCP server2:http (LISTEN) 2、根据进程号查看进程对应的可执行程序  ps -f -p 进程号 # ps -f -p 5014 UID        PID  PPID  C STIME T
庞小明
2018/07/06
4K1
linux查看端口号占用命令-netstat
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40425640/article/details/79065225
拓荒者
2019/03/15
8.2K0
linux查看端口号占用命令-netstat
linux查看端口占用的命令_端口占用查看命令
大家好,又见面了,我是你们的朋友全栈君。 在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询 netstat命令各个参数说明如下:   -t : 指明显示TCP端口   -u : 指明显示UDP端口   -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)   -p : 显示进程标识符和程序名称,每一个套接字/端口都属于一个程序。   -n : 不进行DNS轮询,显示IP(可以加速操作) 即可显示当前服务器上所有端口及进程服务,于grep结合可查看某个具体端口及服务情况·· netstat -ntlp //查看当前所有tcp端口· netstat -ntulp |grep 80 //查看所有80端口使用情况·
全栈程序员站长
2022/09/18
86.5K0
Linux系列(四):我经常用下列命令查看进程id
序号 001 查看端口被哪个进程占用 1. lsof -i:端口号, 查看某一端口的占用情况 [root@localhost bin]# lsof -i:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 3511 root 46u IPv6 31351 0t0 TCP *:webcache (LISTEN) COMMAND:进行成名,如上说明8080被一个java进程占用 PID:进程的ID,一般杀掉进程时就是指定进程的PID USER
冰霜
2022/03/15
2.4K0
Linux系列(四):我经常用下列命令查看进程id
debian查询端口进程_Linux 查看端口占用情况[通俗易懂]
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
全栈程序员站长
2022/09/18
17.7K0
Windows 和 Linux 如何根据端口号查找进程并杀掉它?手把手教你!
在日常的网络运维和开发中,我们常常需要根据 端口号 查找占用该端口的进程,并在必要时终止该进程。不同操作系统下,查找和杀掉进程的方法有所不同。今天,我们将为你详细讲解在 Windows 和 Linux 系统中,如何根据端口号查找并终止相关进程,帮助你高效解决网络端口占用问题。
神的孩子都在歌唱
2025/03/05
8370
Windows 和 Linux 如何根据端口号查找进程并杀掉它?手把手教你!
推荐阅读
相关推荐
Linux常用命令
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验