1.Object.create與new的不同
????????Object.create(prototype, descriptors),創(chuàng)建一個(gè)具有指定原型且可選擇性地包含指定屬性的對(duì)象。
? ? ? ? prototype:必需,要用作原型的對(duì)象??梢詾閚ull。
? ? ? ? descriptors:可選。包含一個(gè)或多個(gè)屬性描述符的JavaScript對(duì)象。

下面的示例創(chuàng)建一個(gè)具有與 Object 對(duì)象相同的內(nèi)部原型的對(duì)象。??您會(huì)發(fā)現(xiàn),該對(duì)象具有與使用對(duì)象文本創(chuàng)建的對(duì)象相同的原型。??Object.getPrototypeOf?函數(shù)可獲取原始對(duì)象的原型。??若要獲取對(duì)象的屬性描述符,可以使用Object.getOwnPropertyDescriptor 函數(shù) (JavaScript)。??


下面的示例創(chuàng)建一個(gè)具有與 Shape 對(duì)象相同的內(nèi)部原型的對(duì)象。


o2為空對(duì)象,但o2.name輸出了jian,在對(duì)象o2上沒有找到name屬性,但在原型o上找到了。
由此可以總結(jié)Object.create()做了:?
1. 創(chuàng)建空對(duì)象{}?
2. 指定空對(duì)象{}的原型為Object.create()的參數(shù)。
new Object()
new配合構(gòu)造函數(shù)使用,創(chuàng)建一個(gè)新對(duì)象。person1的原型是Person.prototype。javascript使用__proto__指向?qū)ο蟮脑汀?/p>

由此可以總結(jié)new做了;
? ? *創(chuàng)建實(shí)例對(duì)象person1。
? ? *調(diào)用構(gòu)造函數(shù)Person初始化person1成員變量。
? ? *指定實(shí)例對(duì)象的原型為Person.prototype對(duì)象。即person1.__proto__指向Person.prototype。
2.Object.defineProperty 函數(shù) (JavaScript)
將屬性添加到對(duì)象,或修改現(xiàn)有屬性的特性。
語法:Object.defineProperty(object, propertyname, descriptor)
? ? ? ? *向?qū)ο筇砑有聦傩?。?dāng)對(duì)象不具有指定的屬性名時(shí),發(fā)生此操作。
? ? ? ? *修改現(xiàn)有屬性的特性。當(dāng)對(duì)象已具有指定的屬性名時(shí),發(fā)生此操作。
參數(shù):
? ? ? ? object:必須。要在其上添加或修改屬性的對(duì)象。這可能是一個(gè)本機(jī)javascript對(duì)象(即用戶自定義的對(duì)象或內(nèi)置對(duì)對(duì)象)或DOM對(duì)象。
? ? ? ? propertyname:一個(gè)包含屬性名的字符串。
? ? ? ? descriptor:屬性描述符。它可以針對(duì)數(shù)據(jù)屬性或訪問器屬性。如果不設(shè)置默認(rèn)都是false。
? ? ? ? ? ? ? ? ? ? ? ? *value:屬性的值。
? ? ? ? ? ? ? ? ? ? ? ? *writable:如果為false,屬性的值就不能被重寫,只能為只讀了。
? ? ? ? ? ? ? ? ? ? ? ? *configurable:總開關(guān),一旦為false,就不能再設(shè)置他的(value,writable,configurable)。
? ? ? ? ? ? ? ? ? ? ? ? *enumerable:是否可枚舉(是否能在for in循環(huán)中遍歷出來或再Object.keys中列舉出來)。
返回值:已修改的對(duì)象。

若要修改對(duì)象的屬性特性,請(qǐng)將以下代碼添加到前面所示的?addDataProperty?函數(shù)。???descriptor?參數(shù)只包含?writable?特性。??其他數(shù)據(jù)屬性特性保持不變。??

Configurable:表示能否通過delete刪除此屬性,能否修改屬性的特性,或能否修改把屬性修改為訪問器屬性,如果直接使用字面量定義對(duì)象,默認(rèn)值為true。
Enumerable:表示該屬性是否可枚舉,即是否可以通過for-in循環(huán)或Object.keys()返回屬性,如果直接使用字面量定義對(duì)象,默認(rèn)值為true。
Writable:能否修改屬性的指,如果直接使用字面量定義對(duì)象,默認(rèn)值為true。
Value:改屬性對(duì)應(yīng)的值,默認(rèn)值為undefined。
Get:一個(gè)給屬性提供getter的方法(訪問對(duì)象屬性時(shí)調(diào)用的函數(shù),返回值就是當(dāng)前屬性的值),如果沒有g(shù)etter則為undefined。
該方法返回值被用作屬性值。默認(rèn)值為undefined。
Set:一個(gè)給屬性提供setter的方法(給對(duì)象屬性設(shè)置值時(shí)調(diào)用的函數(shù)),如果沒有setter則為undefined。該方法將接受唯一參數(shù),并將該參數(shù)的新值分配給該屬性。默認(rèn)為undefined。
屬性的enumerable值定義對(duì)象的屬性是否會(huì)出現(xiàn)在枚舉器(for..in循環(huán)和Object.keys())中。

屬性的configurable值控制一個(gè)對(duì)象的屬性可否被delete刪除,同時(shí)也控制該屬性描述符的配置可否改變(除了前文所述在configurable為false時(shí),若writable為true,則仍可以進(jìn)行一次修改將writable改變?yōu)閒alse)。