用法
Object.create(proto, [ propertiesObject ])
該方法創(chuàng)建一個擁有指定原型和若干個指定屬性的對象昭雌。
(1)proto
一個對象堆生,作為新創(chuàng)建對象的原型盈匾。
注:
如果 proto
參數(shù)不是null或一個對象值,
則拋出一個TypeError
異常裙椭。
(2)propertiesObject
可選躏哩。
該參數(shù)對象是一組屬性與值,該對象的屬性名稱將是新創(chuàng)建的對象的屬性名稱揉燃,值是屬性描述符(這些屬性描述符的結(jié)構(gòu)與Object.defineProperties()的第二個參數(shù)一樣)扫尺。
注:
propertiesObject
不能是 undefined
,
且只有該對象自身擁有的可枚舉屬性才有效炊汤,原型鏈上屬性無效正驻。
例子
var a=Object.create(null); //創(chuàng)建一個__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)對象的屬性描述符有兩種形式:數(shù)據(jù)描述符和存取描述符
共有的:
configurable:false 該屬性是否可以被設(shè)置和刪除
enumerable:false 該屬性是否可以被枚舉
數(shù)據(jù)描述符:
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