ECMAScript5 Object的新属性方法
Object.create(prototype[,descriptors])
這個方法用于創建一個對象,并把其prototype屬性賦值為第一個參數,同時可以設置多個descriptors,關于decriptor下一個方法就會介紹這里先不說。只需要這樣就可以創建一個原型鏈干凈對象了:
var o = Object.create({"say": function () {alert(this.name);},"name":"Byron"});Object.defineProperty(O,Prop,descriptor) / Object.defineProperties(O,descriptors)
想明白這兩個函數必須明白descriptor是什么,在之前的JavaScript中對象字段是對象屬性,是一個鍵值對,而在ECMAScript5中引入property,property有幾個特征
value:值,默認是undefined;
writable:是否是只讀property,默認是false,有點像C#中的const;
enumerable:是否可以被枚舉(for in),默認false;
configurable:是否可以被刪除,默認false同樣可以像C#、Java一樣些get/set,不過這兩個不能和value、writable同時使用;
5.get:返回property的值得方法,默認是undefined;
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); //24o.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)); //trueo.lastName = 'Sun';console.log(o.lastName); //Sun ,此時對象可以拓展Object.preventExtensions(o);console.log(Object.isExtensible(o)); //falseo.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面向對象設計提供了進一步的可配置性,用起來感覺很不錯。
總結
以上是生活随笔為你收集整理的ECMAScript5 Object的新属性方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 顺丰速运如何开发票(顺丰快递单号查询)
- 下一篇: 两个弹窗相互切换(安卓苹果通用方法)