ES5 object的新函數

雖說如今並非全部的瀏覽器都已經支持ECMAScript5的新特性,但相比於ECMAScript4而言ECMAScript5被廣大瀏覽器廠商普遍接受,目前主流的瀏覽器中只有低版本的IE不支持,其它都或多或少的支持了ECMAScript5的新特性,其中重中之重天然是一切對象的基類型——Objectjava

Object.create(prototype[,descriptors])

這個方法用於建立一個對象,並把其prototype屬性賦值爲第一個參數,同時能夠設置多個descriptors,關於decriptor下一個方法就會介紹這裏先不說。只須要這樣就能夠建立一個原型鏈乾淨對象了數組

複製代碼
var o = Object.create({
            "say": function () {
                alert(this.name);
            },
            "name":"Byron"
        });
複製代碼

image

Object.defineProperty(O,Prop,descriptor) / Object.defineProperties(O,descriptors)

想明白這兩個函數必須明白descriptor是什麼,在以前的JavaScript中對象字段是對象屬性,是一個鍵值對,而在ECMAScript5中引入property,property有幾個特徵瀏覽器

1. value:值,默認是undefined函數

2. writable:是不是隻讀property,默認是false,有點像C#中的constthis

3. enumerable:是否能夠被枚舉(for in),默認falsespa

4. configurable:是否能夠被刪除,默認falseprototype

一樣能夠像C#、Java同樣些get/set,不過這兩個不能和value、writable同時使用設計

5.get:返回property的值得方法,默認是undefinedcode

6.set:爲property設置值的方法,默認是undefined對象

複製代碼
Object.defineProperty(o,'age', {
            value: 24,
            writable: true,
            enumerable: true,
            configurable: true
        });

        Object.defineProperty(o, 'sex', {
            value: 'male',
            writable: false,
            enumerable: false,
            configurable: false
        });

        console.log(o.age); //24
        o.age = 25;

        for (var obj in o) {
            console.log(obj + ' : ' + o[obj]);
            /*
            age : 25  //沒有把sex : male 遍歷出來
            say : function () {
                alert(this.name);
            } 
            name : Byron 
            */
        }
        delete o.age;
        console.log(o.age);//undefined 

        console.log(o.sex); //male
        //o.sex = 'female'; //Cannot assign to read only property 'sex' of #<Object> 
        delete o.age; 
        console.log(o.sex); //male ,並無被刪除
複製代碼

也可使用defineProperties方法同時定義多個property,

複製代碼
Object.defineProperties(o, {
            'age': {
                value: 24,
                writable: true,
                enumerable: true,
                configurable: true
            },
            'sex': {
                value: 'male',
                writable: false,
                enumerable: false,
                configurable: false
            }
        });
複製代碼

Object.getOwnPropertyDescriptor(O,property)

這個方法用於獲取defineProperty方法設置的property 特性

var props = Object.getOwnPropertyDescriptor(o, 'age');
        console.log(props); //Object {value: 24, writable: true, enumerable: true, configurable: true}

Object.getOwnPropertyNames

獲取全部的屬性名,不包括prototy中的屬性,返回一個數組

console.log(Object.getOwnPropertyNames(o)); //["age", "sex"]

例子中能夠看到prototype中的name屬性沒有獲取到

Object.keys()

和getOwnPropertyNames方法相似,可是獲取全部的可枚舉的屬性,返回一個數組

console.log(Object.keys(o)); //["age"]

上面例子能夠看出不可枚舉的sex都沒有獲取的到

Object.preventExtensions(O) / Object.isExtensible

方法用於鎖住對象屬性,使其不可以拓展,也就是不能增長新的屬性,可是屬性的值仍然能夠更改,也能夠把屬性刪除,Object.isExtensible用於判斷對象是否能夠被拓展

複製代碼
console.log(Object.isExtensible(o)); //true
        o.lastName = 'Sun';
        console.log(o.lastName); //Sun ,此時對象能夠拓展

        Object.preventExtensions(o);
        console.log(Object.isExtensible(o)); //false

        o.lastName = "ByronSun";
        console.log(o.lastName); //ByronSun,屬性值仍然能夠修改

        //delete o.lastName;
        console.log(o.lastName); //undefined仍可刪除屬性

         o.firstname = 'Byron'; //Can't add property firstname, object is not extensible 不可以添加屬性
複製代碼

Object.seal(O) / Object.isSealed

方法用於把對象密封,也就是讓對象既不能夠拓展也不能夠刪除屬性(把每一個屬性的configurable設爲false),單數屬性值仍然能夠修改,Object.isSealed因爲判斷對象是否被密封

Object.seal(o);
        o.age = 25; //仍然能夠修改
        delete o.age; //Cannot delete property 'age' of #<Object>

Object.freeze(O) / Object.isFrozen

終極神器,徹底凍結對象,在seal的基礎上,屬性值也不能夠修改(每一個屬性的wirtable也被設爲false)

Object.freeze(o);
        o.age = 25; //Cannot assign to read only property 'age' of #<Object>

最後

上面的代碼都是在Chrome 29下一嚴格模式(’use strict’)運行的,並且提到的方法都是Object的靜態函數,也就是在使用的時候應該是Object.xxx(x),而不能以對象實例來調用。整體來講ES5添加的這些方法爲javaScript面向對象設計提供了進一步的可配置性,用起來感受很不錯。

相關文章
相關標籤/搜索