一、對對象屬性的操作(defineProperties)
- Object.defineProperty () 和Object.defineProperties()方法會直接在一個對象上定義一個新屬性烫沙,或者修改一個對象的現(xiàn)有屬性窜管,并返回此對象
-
Object.defineProperty(obj, prop, descriptor)
接受三個參數(shù)拨拓,返回傳遞給函數(shù)的對象(obj)捏检,因此不是一個純函數(shù)
obj
要定義屬性的對象
prop
要定義或修改的屬性的名稱或symbol
descriptor
要定義或修改的屬性描述符
屬性描述符:
數(shù)據(jù)屬性(Data Properties)描述符(Descriptor);
存取屬性(Accessori訪問器Properties)描述符(Descriptor);
Configurable:表示屬性是否可以通過deletef刪除屬性,是否可以修改它的特性,或者是否可以將它修改為存取屬性
描述符磕蒲;
- 當我們直接在一個對象上定義某個屬性時,這個屬性的[Configurable]為true;
- 當我們通過屬性描述符定義一個屬性時只盹,這個屬性的[Configurable]默認為false;
Enumerable:表示屬性是否可以通過for-in或者Object.keys0返回該屬性辣往;
- 當我們直接在一個對象上定義某個屬性時,這個屬性的[Enumerable]為true;
- 當我們通過屬性描述符定義一個屬性時殖卑,這個屬性的[Enumerable]默認為false;
Writable:表示是否可以修改屬性的值站削;
- 當我們直接在一個對象上定義某個屬性時,這個屬性的[Writable]為true;
- 當我們通過屬性描述符定義一個屬性時孵稽,這個屬性的[Writable]默認為false;
value:屬性的value值钻哩,讀取屬性時會返回該值,修改屬性時肛冶,會對其進行修改街氢;
口默認情況下這個值是undefined;
ps:value、writable睦袖、get珊肃、set不能共存
使用示例
const object1 = {};
Object.defineProperty(object1, 'property1', {
value: 42,
writable: false,
});
object1.property1 = 77;
// Throws an error in strict mode
console.log(object1.property1);
// Expected output: 42
const obj = {};
Object.defineProperties(obj, {
property1: {
value: true,
writable: true,
},
property2: {
value: "Hello",
writable: false,
},
// 等等……
});
二、對象的創(chuàng)建
1馅笙、工廠模式
function createPerson(name,age,height,address){
var p = {}
p.name= name
p.age= age
p.height=height
p.address= address
p.eating= function(){
console.Log(this.name+,"在吃東西~")}
p.running= function(){
console.log(this.name+."在跑步~")}
return p
}
工廠模式的缺點:
- 拿不到對象的類型
- 每一個對象都有屬性自己的方法伦乔,沒有公共的部分
2、構(gòu)造函數(shù)
- 使用new關(guān)鍵字來調(diào)用一個函數(shù)董习,則這個函數(shù)就是一個構(gòu)造函數(shù)烈和,使用該構(gòu)造函數(shù)的函數(shù)執(zhí)行流程
1.在內(nèi)存中創(chuàng)建一個新的對象(空對象);
2.這個對象內(nèi)部的[prototype]屬性會被賦值為該構(gòu)造函數(shù)的porototype屬性
3.構(gòu)造函數(shù)內(nèi)部的this,會指向創(chuàng)建出來的新對象皿淋;
4.執(zhí)行函數(shù)的內(nèi)部代碼(函數(shù)體代碼)
5.如果構(gòu)造函數(shù)沒有返回非空對象招刹,則返回創(chuàng)建出來的新對象; - 約定如果想把一個函數(shù)作為構(gòu)造函數(shù)來使用窝趣,則將函數(shù)的首字母大寫
function Person(name, age, height, address) {
this.name = name;
this.age = age;
this.height = height;
this.address = address;
this.eating = function () {
console.log(this.name + "在吃東西~");
};
this.running = function () {
console.log(this.name + "在跑步");
};
}
varp1 = new Person("張三", 18, 1.88, "廣州市");
構(gòu)造函數(shù)的缺點:
- 每一個對象都有屬性自己的方法疯暑,沒有公共的部分(可使用原型來優(yōu)化)