用法
Object.create(proto, [ propertiesObject ])
该方法创建一个拥有指定原型和若干个指定属性的对象。
(1)proto
一个对象,作为新创建对象的原型。
注:
如果 proto
参数不是null或一个对象值,
则抛出一个TypeError
异常。
(2)propertiesObject
可选。
该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符(这些属性描述符的结构与Object.defineProperties()的第二个参数一样)。
注:
propertiesObject
不能是 undefined
,
且只有该对象自身拥有的可枚举属性才有效,原型链上属性无效。
例子
var a=Object.create(null); //创建一个__proto__为null的对象
var b=Object.create(Object.prototype); //相当于new Object,即立即对象{}
var base={
v:1
};
var sub=Object.create(base); //让sub.__proto__===base,原型继承
console.log(sub.v); //1
var obj=Object.create(Object.prototype,{
v:{
configurable:true,
enumerable:true,
writable:true,
value:1
}
});
注:
(1)如果configurable===false
,
则不能再改变configurable
和enumerable
。
可以将writable
从true
改成false
,但是不能从false
改为true
。
value
能否改变,取决于writable
。
(2)如果writable===false
obj.v
重新赋值并不会报错,只是没有生效。
(3)对象的属性描述符有两种形式:数据描述符和存取描述符
共有的:
configurable:false 该属性是否可以被设置和删除
enumerable:false 该属性是否可以被枚举
数据描述符:
writable:false 该属性是否可以被赋值运算符改变
value:undefined 该属性的值
存取描述符:
get:undefined 该属性的读取器方法
set:undefined 该属性的写入器方法
(4)Object.defineProperty
有副作用会改变obj
,但也会返回改变后的同一个obj
对象
var obj2=Object.defineProperty(obj,'v',...)
obj2===obj
(5)我们可以使用Object.getPrototypeOf
来获取一个对象的原型(相当于__proto__
)
var obj = Object.create(proto);
Object.getPrototypeOf(obj) === proto