描述:凍結obj對象的屬性和值,使該對象不能添加屬性,修改屬性值(屬性值是值類型的,若是是引用類型就算凍結了也能夠修改)和刪除屬性。dom
用處:得到一個不可修改的對象函數
var obj = { prop:'123', foo:{ bar:'free' } } var o = Object.freeze(obj); o === obj; // 被凍結的對象和返回的對象是同一個對象,不是返回一個對象副本 obj.quaxxor = '添加屬性' // 添加不上 console.log(obj); obj.prop = '修改屬性值'; // 沒法修改,仍是默認值 console.log(obj); delete obj.prop // 沒法刪除 console.log(obj); obj.foo.bar = 'dom'; // 值被修改了 console.log(obj)
描述:建立一個新對象,並把現有對象設置成新建對象的__proto__,第二個參數爲添加到新對象上的屬性(至關於直接使用點號運算符建立新屬性);性能
做用:快速一個基於原型繼承的對象this
const animal = { hasHair: false, hairColor:'white', getHairColor: function () { console.log('Animal\'s hair color is '+this.hairColor); } }; const cat = Object.create(animal, { name:{ // 新添加的屬性值必須是對象,參考Object.defineProperty配置 writable:true, // 設置name屬性的值是可修改的 configurable:true, enumerable:true, // 設置屬性可被枚舉,若是不設置的話默認是false,在cat對象上打斷點會看到name和其餘屬性顯示不太同樣 value:'' } }); cat.hasHair = true; cat.hairColor = 'black'; cat.name = 'black cat'; // 若是設置writable:true, configurable:true 沒法修改name屬性 console.log(cat.__proto__ === animal); // true cat.getHairColor(); // Animal's hair color is black console.log(cat.name); // black cat
描述:返回對象的可枚舉屬性,快速獲取對象上的屬性名,但不包含對象原型上的屬性。Object.keys和for...in的區別是後者能夠遍歷到對象原型(繼承)的屬性spa
做用:快速獲取對象上的屬性名,不用再用for...in一個一個遍歷獲取code
var obj = Object.create({ prop:'123', foo:{ bar:'free' } }, { getFoo:function(){ } }) obj.self = 'self'; console.log(Object.keys(obj)) // ['self']
描述:在對象上定義新屬性,或者修改原有屬性對象
做用:blog
/* 定義對象的方式有兩種,字面量和構造函數 * 定義屬性的方式也有兩種,直接在對象上添加和使用Object.defineProperty * 使用Object.defineProperty定義和修改屬性的方式是使用屬性描述符 * */ var val; var obj = Object.create({ name:'zhang', getName:function(){ console.log(this.name); } }, { age:{ // 使用數據描述符定義屬性,該方式有writable[true|false], configurable[true|false], enumerable[true|false], value[任意類型] writable:false, // 設置屬性的值是否能夠被修改,默認爲false configurable:true, // 設置屬性的描述符(age後面的對象就是描述符)是否能夠被修改,默認爲false enumerable:true, // 設置屬性可否被for...in和Object.keys枚舉,默認爲false value:27 }, sex:{ // 使用存取描述符定義屬性,該方式有configurable[true|false], enumerable[true|false], get[function], set[function] configurable:true, enumerable:true, get:function(){ return val; }, set:function(newValue){ val = newValue; } } }) // 字面量方式定義的對象,其屬性描述符的writable, configurable, enumerable 都是true console.log(Object.getOwnPropertyDescriptor({name:'zhang'}, 'name')) // 對比for...in和Object.keys()的區別 for(var key in obj){ if(typeof obj[key] !== 'function') console.log(key); } console.log(Object.keys(obj)); // 修改數據描述符,主要對比configurable不一樣設置的影響 Object.defineProperty(obj, 'age', { writable:true }) // 存取描述符修改屬性值 obj.sex = 'male'; console.log(obj.sex);