Object.create(prototype[,descriptors])
- 這個(gè)方法用于創(chuàng)建一個(gè)對(duì)象饵较,并把其prototype屬性賦值為第一個(gè)參數(shù),同時(shí)可以設(shè)置多個(gè)descriptors遭赂,關(guān)于decriptor下一個(gè)方法就會(huì)介紹這里先不說告抄。只需要這樣就可以創(chuàng)建一個(gè)原型鏈干凈對(duì)象了
var o = Object.create({
"say": function() {
alert(this.name);
},
"name": "Byron"
});
image.png
Object.defineProperty(O,Prop,descriptor) / Object.defineProperties(O,descriptors)
- 想明白這兩個(gè)函數(shù)必須明白descriptor是什么,在之前的JavaScript中對(duì)象字段是對(duì)象屬性嵌牺,是一個(gè)鍵值對(duì)打洼,而在ECMAScript5中引入property,property有幾個(gè)特征
- value:值逆粹,默認(rèn)是undefined
- writable:是否是只讀property募疮,默認(rèn)是false,有點(diǎn)像C#中的const
- enumerable:是否可以被枚舉(for in),默認(rèn)false
- configurable:是否可以被刪除僻弹,默認(rèn)false芭毙;同樣可以像C#、Java一樣些get/set侈百,不過這兩個(gè)不能和value讽坏、writable同時(shí)使用
- get:返回property的值得方法织咧,默認(rèn)是undefined
- set:為property設(shè)置值的方法巡社,默認(rèn)是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方法同時(shí)定義多個(gè)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)
- 這個(gè)方法用于獲取defineProperty方法設(shè)置的property 特性
var props = Object.getOwnPropertyDescriptor(o, 'age');
console.log(props); //Object {value: 24, writable: true, enumerable: true, configurable: true}
Object.getOwnPropertyNames
- 獲取所有的屬性名右莱,不包括prototy中的屬性,返回一個(gè)數(shù)組
console.log(Object.getOwnPropertyNames(o)); //["age", "sex"]
例子中可以看到prototype中的name屬性沒有獲取到
Object.keys()
- 和getOwnPropertyNames方法類似晨抡,但是獲取所有的可枚舉的屬性调煎,返回一個(gè)數(shù)組
console.log(Object.keys(o)); //["age"]
上面例子可以看出不可枚舉的sex都沒有獲取的到
Object.preventExtensions(O) / Object.isExtensible
- 方法用于鎖住對(duì)象屬性,使其不能夠拓展窖剑,也就是不能增加新的屬性,但是屬性的值仍然可以更改,也可以把屬性刪除肋乍,Object.isExtensible用于判斷對(duì)象是否可以被拓展
console.log(Object.isExtensible(o)); //true
o.lastName = 'Sun';
console.log(o.lastName); //Sun ,此時(shí)對(duì)象可以拓展
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
- 方法用于把對(duì)象密封,也就是讓對(duì)象既不可以拓展也不可以刪除屬性(把每個(gè)屬性的configurable設(shè)為false),單數(shù)屬性值仍然可以修改蛉拙,Object.isSealed由于判斷對(duì)象是否被密封
Object.seal(o);
o.age = 25; //仍然可以修改
delete o.age; //Cannot delete property 'age' of #<Object>
Object.freeze(O) / Object.isFrozen
- 完全凍結(jié)對(duì)象硫惕,在seal的基礎(chǔ)上,屬性值也不可以修改(每個(gè)屬性的wirtable也被設(shè)為false)
Object.freeze(o);
o.age = 25; //Cannot assign to read only property 'age' of #<Object>