方法说明javascript
Object.create()
方法建立一个新的对象,并以方法的第一个参数做为新对象的__proto__
属性的值(以第一个参数做为新对象的构造函数的原型对象)Object.create()
方法还有第二个可选参数,是一个对象,对象的每一个属性都会做为新对象的自身属性,对象的属性值以descriptor(Object.getOwnPropertyDescriptor(obj, 'key'))
的形式出现,且enumerable
默认为false
源码点拨java
搞清楚上面的方法描述说的意思,而后实现的时候实际上是比较简单的,就是定义一个空的构造函数,而后指定构造函数的原型对象,经过
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'}