Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
new和Object.create
new 运算符在平时开发中极少用到,但是所有人都知道,而Objext.create()方法就比较少知道了,我也是在学new过程的时候知道了这个方法。今天分享一下这两个API,虽然自己还是没有很清楚。
wade
2020/04/23
3260
Object 中的几个很相似的方法
这里主要讨论这么几个方法,他们用法很相似,但又有所不同。在实际开发中就有可能陷入其中,搞不清到底用哪个方法比较好。下面就开始一一介绍。
多云转晴
2019/10/23
6350
Object 中的几个很相似的方法
32个常考的手写面试题,值得动手练一练
https://juejin.cn/post/6963167124881670152
前端达人
2021/06/16
7940
【JS】479- 又见原型和原型链
在前端这块领域,原型与原型链是每一个前端er必须掌握的概念。我们多次在面试或者一些技术博客里面看见这个概念。由此可见,这个玩意对于前端来说有多重要。其实它本身理解起来不难,但是很多刚入行前端的同学,看到prototype、__proto__理解起来还是有点吃力,然后脑子里面就乱成一锅粥,就像我一样。但是这是很正常的事情,没什么大不了的,就像我们想要学会跑步,那么我们就必须先学会走路。任何事情都是有个过程的。所以现在就跟我一起来攻克这个难点吧。通过这篇文章你将掌握以下知识点:
pingan8787
2020/02/17
7040
详解JavaScript的Object对象
Object 是 JavaScript 的一种 数据类型 ,用于存储各种键值集合和更复杂的实体,几乎所有对象都是 Object 类型的实例,它们都会从 Object.prototype 继承属性和方法,虽然大部分属性都会被覆盖(shadowed)或者说被重写了(overridden)。
Learn-anything.cn
2021/12/22
6930
Object.assign()用法
用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
薛定喵君
2019/11/05
9900
30道高频JS手撕面试题
Object.getPrototypeOf:用来获取某个实例对象的原型(内部[[prototype]]属性的值,包含proto属性)
前端迷
2020/09/30
2.4K0
30道高频JS手撕面试题
【放假月日更】Object.create() 详解
你会发现,第一个参数,在返回对象的原型上,而不是直接属性,可再回顾一下Object.create实现的底层原理;
用户9914333
2022/07/22
2500
【放假月日更】Object.create() 详解
【JS】307- 复习 Object.assign 原理及其实现
上篇文章介绍了赋值、浅拷贝和深拷贝,其中介绍了很多赋值和浅拷贝的相关知识以及两者区别,限于篇幅只介绍了一种常用深拷贝方案。
pingan8787
2019/08/06
1.2K0
【前端基础进阶】JS-Object 功能详解
该方法主要用于对象的合并,将源对象source的所有可枚举属性合并到目标对象target上,此方法只拷贝源对象的自身属性,不拷贝继承的属性。 Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。同名属性会替换。
super.x
2019/04/12
1.6K0
【前端基础进阶】JS-Object 功能详解
js手写题汇总(面试前必刷)
event bus既是node中各个模块的基石,又是前端组件通信的依赖手段之一,同时涉及了订阅-发布设计模式,是非常重要的基础。
helloworld1024
2022/11/09
1.1K0
深入学习 JavaScript——Object 对象
JavaScript的世界中「一切皆是对象」,而所有对象的起源就是 Object 对象。
李振
2021/11/26
6730
前端进阶高薪必看-手写源码
此系列作为笔者之前发过的前端高频面试整理的补充 会比较偏向中高前端面试问题 当然大家都是从新手一路走过来的 感兴趣的朋友们都可以看哈
青梅煮码
2023/03/13
7610
Object.assign()
Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
李才哥
2019/07/10
8870
ES6之Object.assign()用法,Object.assign()到底是浅拷贝还是深拷贝?
Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
江一铭
2022/06/17
2.2K0
JavaScript之对象(二)
Object.assign()可以用来将原对象的属性合并到目标对象上,而且这个方法还会返回合并后的目标对象。它会使用源对象上的[[Get]]取得属性的值,然后使用目标对象上的[[Set]]设置属性的值。
赤蓝紫
2023/03/16
3270
JavaScript之对象(二)
JavaScript面试题
1、实现一个call函数 // 思路:将要改变this指向的方法挂到目标this上执行并返回 Function.prototype.mycall = function (context) { if (typeof this !== 'function') { throw new TypeError('not funciton') } context = context || window context.fn = this let arg = [...arguments].sl
挨踢小子部落阁
2019/08/13
6110
Object.assign应用详解
Object.assign的主要作用就是将所有可枚举属性的值从一个或多个源对象复制到目标对象,同时将目标对象返回。如果目标对象是一个已经存在的对象,此对象将被改变
OECOM
2020/07/01
7560
JavaScript —— New
热身 New 这个关键字 是创建对象的? JS中万物皆是对象。 new 关键字是用来继承的。 => 面向对象的基础 new function DN(name, age) { this.name = name; this.age = age; this.salary = '30k'; } DN.prototype.ability = 100; DN.prototype.sayYourName = function(){ console.log('I am' + this.name); }
FinGet
2019/06/28
5610
没对象?new一个呗😝
在JavaScript中,new是一个非常重要的关键字,它用于创建对象实例。虽然new看起来很简单,但它背后隐藏着一些复杂的原理和机制。本文将深入解析JavaScript中的new关键字,介绍其作用、原理,并提供一些代码示例来帮助读者更好地理解。
can4hou6joeng4
2023/11/16
3150
相关推荐
new和Object.create
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验