语法:
Object.create(proto,[propertiesObject])
用法:
使用指定的原型对象和属性创建一个新对象。
参数:
proto:新创建对象的原型对象
propertiesObject:创建对象的描述对象,如果该参数被指定且不为 undefined,该传入对象的自 有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加 指定的属性值和对应的属性描述符。
示例代码:
let obj1 = {
name:'zs',
age:15
}
let obj3 = Object.create(obj1,{
hate:{
value:'laoshu',//属性值
enumerable:true,//可遍历
writable:true,//可修改
configurable:true,//可删除
},
run:{
configurable:true,
get:function () {
console.log('跑了');
return '100米'
},
set:function(val){
console.log(val);
return val
}
}
})
console.log(obj3)
打印输出:
我们可以看到并没有obj1的name和age属性,这是为什么呢,我们可以看Object.create的实现
Object.create = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
可以看到,传入的proto属性被作为返回对象的原型对象传入到了原型之上,所以
属性描述对象
用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes object)。每个属性都有自己对应的属性描述对象,保存该属性的一些元信息。
{
value:'value',//属性值
enumerable:true,//可遍历
writable:true,//可修改
configurable:true,//可删除
get:(){},//访问该属性时触发
set:(){},//修改改属性时触发
}
Object.create(null)与字面量定义对象的区别
let obj4 = Object.create(null)
let obj5 = {}
let obj6 = new Object
console.log(obj4,'obj4');
console.log(obj5,'obj5');
console.log(obj6,'obj6');
可以看出:
1、对象字面量创建对象 ,new Object() 和 { } 效果是一样
2. 通过Object.create(null)创建的对象是非常纯净的,原型链的属性和方法都不会携带。这就非常适合数组对象开发的时候,从对象中取值,提高循环效率。