Object.create
方法说明
Object.create()
方法创建一个新的对象,并以方法的第一个参数作为新对象的__proto__
属性的值(以第一个参数作为新对象的构造函数的原型对象)Object.create()
方法还有第二个可选参数,是一个对象,对象的每个属性都会作为新对象的自身属性,对象的属性值以descriptor(Object.getOwnPropertyDescriptor(obj, 'key'))
的形式出现,且enumerable
默认为false
源码点拨
搞清楚上面的方法描述说的意思,然后实现的时候其实是比较简单的,就是定义一个空的构造函数,然后指定构造函数的原型对象,通过
new
运算符创建一个空对象,如果发现传递了第二个参数,通过Object.defineProperties为创建的对象设置key、value,最后返回创建的对象即可
源码
Object.myCreate = function (proto, propertyObject = undefined) {
if (propertyObject === null) {
// 这里没有判断propertyObject是否是原始包装对象
throw 'TypeError'
} else {
function Fn () {}
Fn.prototype = proto
const obj = new Fn()
if (propertyObject !== undefined) {
Object.defineProperties(obj, propertyObject)
}
if (proto === null) {
// 创建一个没有原型对象的对象,Object.create(null)
obj.__proto__ = null
}
return obj
}
}
// 示例
// 第二个参数为null时,抛出TypeError
// const throwErr = Object.myCreate({a: 'aa'}, null) // Uncaught TypeError
// 构建一个以
const obj1 = Object.myCreate({a: 'aa'})
console.log(obj1) // {}, obj1的构造函数的原型对象是{a: 'aa'}
const obj2 = Object.myCreate({a: 'aa'}, {
b: {
value: 'bb',
enumerable: true
}
})
console.log(obj2) // {b: 'bb'}, obj2的构造函数的原型对象是{a: 'aa'}