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.setPrototypeOf(Student.prototype, Person.prototype)

console.log(Student.prototype)

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

在这里插入图片描述
拓展:

  • 1. 获取对象的原型:xx.getPrototypeOf()
  • 2. 获取对象的属性描述符:Object.getOwnPropertyDescriptor(xx, 'xx')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小小白zyw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值