Object.setPrototypeOf 与 Object.create() 的区别

这篇具有很好参考价值的文章主要介绍了Object.setPrototypeOf 与 Object.create() 的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在讲之前,我们先回顾下创建对象的几种方式,并且Objectnew Object()Object.create 的区别

①:字面量方式创建对象

let person = {
  name: 'nick'
}

②:构造函数式创建对象

let person = new Object({ name: 'nick' })

③:Objecr.create 创建对象

let person = Object.create(Object.prototype, { 
	name: 'nick',
    enumerable: true, // 可枚举
    configurable: true, // 可通过Object.definePrototype修改其配置 
    writable: true // 可重写
})

第一和第二种本质上没任何区别,只是简化写法,说下第二种和第三种的区别:

new Object() 的过程中会继承 Object 构造函数的原型,我们可以看下 new 的过程发生了什么:

function MyNew(fun) {
	// 创建一个对象
	let obj = {}
	// 获取参数,这里要给参数arguments绑定Array原型上的方法,并且排除第一个参数fun
	let args = Array.prototype.slice.call(arguments, 1)
	// 执行函数,绑定this,这里用call也一样,只不过参数类型不一样
	let res = fun.apply(obj, args)
	// 绑定原型,这里也可以用Object.setPrototypeOf()来绑定,也可以使用 Reflect.setPrototypeOf() 来绑定
	obj.__proto__ = fun.prototype
	// Object.setPrototypeOf(obj, fun.prototype)
	// Reflect.setPrototypeOf(obj, fun.prototype)
	// 判断是否返回对象,反之返回生成的对象
	return Object.prototype.toString.call(res) === '[object Object]' ? res : obj
}

以上我们可以看到,继承了Object的原型,而Object.create第一个参数恰恰是设置原型,第二个参数可以绑定自身的属性和方法,并且设置其属性描述符,接下来,我们研究下 Objecr.createObject.setProrotypeOf 的区别

备注:都是 ES5 提出的新方法

function Student() {
  this.name = '小明'
}

Student.prototype.getName = function () {
  return this.name
}

function Person() {
  this.age = 18
}

Person.prototype.getAge = function () {
  return this.age
}

Student.prototype = Object.create(Person.prototype)

console.log(Student.prototype)

通过打印结果,我们可以看到 Student 原有的原型以及构造函数全部被替换:

Object.setPrototypeOf 与 Object.create() 的区别
我们再尝试 Object.setPrototypeOf 方法

Object.setPrototypeOf(Student.prototype, Person.prototype)

console.log(Student.prototype)

通过打印可以看到,保留当前的原型对象,并且基于当前的原型对象又添加了新的 prototype

Object.setPrototypeOf 与 Object.create() 的区别
拓展:文章来源地址https://www.toymoban.com/news/detail-406206.html

  • 1. 获取对象的原型:xx.getPrototypeOf()
  • 2. 获取对象的属性描述符:Object.getOwnPropertyDescriptor(xx, 'xx')

到了这里,关于Object.setPrototypeOf 与 Object.create() 的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • git push 错误 error: remote unpack failed: unable to create temporary object directory

    我们在向git服务器提交代码时候,遇到问题如下问题: git push 错误 error: remote unpack failed: unable to create temporary object directory 我们在使用git push本地代码实收遇到问题: 修改git repositories 的权限,执行如下命令:

    2024年02月07日
    浏览(37)
  • Django rest_framework Serializer中的create、Views中的create/perform_create的区别

    对于后端来说,前后端分离的方式能让前后端的开发都爽。和所有的爽一样,每爽一次都要付出一定的代价。而前后端分离的代价,就是后端要面对巨量的模块化的功能组件以及这些组件的常规用法与重写复用。有一点经验,关于[Django rest_framework ] Serializer 中的create()、 Vie

    2024年02月13日
    浏览(34)
  • kubectl create 与 kubectl apply的区别

    kubectl apply 和 kubectl create 都是Kubernetes(k8s)中用于创建或更新资源的命令,但它们在使用方式、功能和灵活性上存在一些区别。 声明式与命令式: kubectl apply :属于声明式命令。它不直接告诉Kubernetes要执行什么操作,而是根据提供的YAML或JSON文件来自动探测并决定需要进行

    2024年03月09日
    浏览(38)
  • kubectl create和kubectl apply的区别

    文章转发自 https://wghdr.top,更多文章请跳转。 kubectl create和kubectl apply都可以生成k8s对象。那么两者有什么区别呢。根据官方文档可以得出如下区别: 是祈使式命令,明确告诉k8s要创建的资源或者对象 首先删除集群中现有的资源,然后重新根据yaml文件生成新的资源对象 yaml文

    2024年02月05日
    浏览(20)
  • hive之with as 和 create temporary区别

            在写hivesql语句时,通常因为实现一个比较复杂的逻辑时,往往使用多层嵌套关联,首先导致代码的可读性较差,其次是代码性能比较低。因为这个原因,很多人都会想方设法去优化代码,提高代码的可读性和性能。在优化中,我们尝尝想到的是去创建临时表的方法。

    2024年02月16日
    浏览(33)
  • 从零开始训练 YOLOv8最新8.1版本教程说明(包含Mac、Windows、Linux端 )同之前的项目版本代码有区别

    从零开始训练 YOLOv8 - 最新8.1版本教程说明 本文适用Windows/Linux/Mac:从零开始使用Windows/Linux/Mac训练 YOLOv8 算法项目 《芒果 YOLOv8 目标检测算法 改进》 适用于芒果专栏改进 YOLOv8 算法 官方 YOLOv8 算法 第一步 配置环境 首先 点击这个链接 https://github.com/ultralytics/ultralytics/tree/v8.1

    2024年01月25日
    浏览(64)
  • Elasticsearch 索引文档时create、index、update的区别【学习记录】

    本文基于elasticsearch7.3.0版本。 一、思维导图 elasticsearch中create、index、update都可以实现插入功能,但是实现原理并不相同。 二、验证index和create 由上面思维导图可以清晰的看出create、index的大致区别,下面我们来验证下思维导图中的场景: 1、首先明确一点:如何指定是creat

    2024年01月20日
    浏览(46)
  • ts定义对象类型Record<string, any>;和object、Object的区别

    Record 是 TS 内置的一个高级类型,是通过映射类型的语法来生成索引类型的 比如传入 \\\'a\\\' | \\\'b\\\' 作为 key,1 作为 value,就可以生成这样索引类型: 所以这里的 Recordstring, any 也就是 key 为 string 类型,value 为任意类型的索引类型,可以代替 object 来用,更加语义化一点: Record 与

    2024年02月16日
    浏览(37)
  • 包管理工具npm和Yarn的区别,我们该如何选择?

    好家伙,学习新工具    关于npm我们已经知道了,这是我们项目的包管理器, 我们现在用的无比顺手的工具,都是在无数的竞争中杀出来的,他们淘汰了无数的产品   首先,倘若我们不使用npm,那么我们应该如何去新建一个前端项目? 纯手工,把我们项目需要的项目一个个下载到我们的

    2024年02月17日
    浏览(40)
  • 【javaScript】Proxy与Object.defineProperty的区别

    Proxy和Object.defineProperty都是JavaScript中用于实现对象属性拦截和代理的机制,但它们在功能和应用方面有一些区别。 Object.defineProperty:它是 ES5 引入的属性定义方法,通过直接定义对象属性的特性(如可枚举性、可写性等),可以拦截属性的读取、写入和删除操作。但它 只能拦

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包