🌈 Object.create(proto, propertiesObject)

参数

const obj = Object.create({ a: 1 }, {
  // descriptor enumerable、configurable、writable 都为 false
  // 只设置 value ,默认 不可枚举,不可删除,不可写
	b: {
  	value: 2,
  },
  c: {
  	value: 3,
    enumerable: true
  },
  d: {
  	value: 4,
    writable: true
  },
  e: {
  	value: 5,
    configurable: true
  }
});

console.log(obj);

for (var key in obj) {
	console.log(`${key}: ${obj[key]}`);
}
delete obj.b;
obj.b = 233;

obj.d = 233;
delete obj.e;

console.log(obj);

Untitled

配合 assign 使用

const obj = Object.create({ a: 1 }, {
	b: {
  	value: 2,
  },
  c: {
  	value: 3,
    enumerable: true
  },
  d: {
  	value: 4,
    enumerable: true
  }
});
const newObj = Object.assign({}, obj);
delete newObj.d;
// 虽然 obj 中 d 属性描述符中默认 configurable 为 false,不可删
// 但赋值给 newObj 后,属性描述符除了 value 其他配置都无效了
// 即只把 obj 上自身的可枚举属性赋值给 {} 而不管这些属性的描述符
console.log(newObj);

Untitled

实现

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
  }
}