⭐️ Object.create(proto, propertiesObject)
参数
- proto: 创建出的对象的原型(必须传一个对象或者null,不能不传第二个参数)
- 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);
配合 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);
实现
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
}
}