Object 對象

object.freeze(obj)

描述:凍結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)

Object.create(obj, [propertiesObject])

描述:建立一個新對象,並把現有對象設置成新建對象的__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(obj)

描述:返回對象的可枚舉屬性,快速獲取對象上的屬性名,但不包含對象原型上的屬性。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']

Object.defineProperty(obj, property, descriptor)

描述:在對象上定義新屬性,或者修改原有屬性對象

做用: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);
相關文章
相關標籤/搜索