標籤:=== 刪除 預設值 必須 The else false cti 不能
備忘:
本文長期修改說明:ECMAScript中屬性有兩種:資料屬性和訪問器屬性。屬性描述符1. 資料屬性說明:當修改或定義對象的某個屬性的時候,給這個屬性添加一些特性。
| 特性名稱 |
描述 |
預設值 |
| value |
設定屬性的值 |
undefined |
| writable |
設定是否可修改值 |
true |
| enumerable |
表示能否通過for-in或 obj.keys()迴圈返回屬性。 |
true |
| configurable |
- 表示能否通過 delete 刪除屬性從而重新定義屬性
- 能否修改屬性的特性
- 能否把屬性修改為訪問器屬性
|
true |
var obj = { test:"hello"}//對象已有的屬性添加特性描述Object.defineProperty(obj,"test",{ configurable:true | false, enumerable:true | false, value:任意類型的值, writable:true | false});//對象新添加的屬性的特性描述Object.defineProperty(obj,"newKey",{ configurable:true | false, enumerable:true | false, value:任意類型的值, writable:true | false});
在使用 Object.defineProperty、Object.defineProperties 或 Object.create 函數的情況下添加資料屬性,writable、enumerable和configurable預設值為 false。
使用 對象字面量 建立的屬性,writable、enumerable和configurable特性預設為true。
2. 訪問器屬性說明:設定或擷取對象的某個屬性的值。
| 特性名稱 |
描述 |
預設值 |
| Get |
在讀取屬性時調用的函數 |
undefined |
| Set |
在寫入屬性時調用的函數 |
true |
| enumerable |
是否可以被枚舉(使用for...in或Object.keys()) |
true |
| configurable |
- 表示能否通過 delete 刪除屬性從而重新定義屬性
- 能否修改屬性的特性
- 能否把屬性修改為訪問器屬性(目標屬性是否可以再次設定特性)
|
true |
var obj = {};Object.defineProperty(obj, "newKey", { get:function (){} | undefined, set:function (value){} | undefined configurable: true | false enumerable: true | false});
注意:當使用了getter或setter方法,不允許使用writable和value這兩個屬性ECMAScript 5中操作屬性特性的方法:1. Object.defineProperty()說明:此方法只能定義一個屬性
文法:
Object.defineProperty(obj, prop, descriptor)
參數列表:
obj:必需。目標對象 prop:必需。需定義或修改的屬性的名字descriptor:必需。目標屬性所擁有的特性
傳回值:
傳入函數的對象。即第一個參數obj
樣本
var obj = {};// Object.defineProperty(對象,屬性,屬性描述符)Object.defineProperty(obj, "name", { get: function(){ return this._name; //在 get 和 set 中使用訪問屬性必須加 "_" }, set: function(val){ if(Array.isArray(val)){ this._name = val; } else{ this._name = "不是數組不能賦值"; } }, enumerable: true, // 表示可枚舉的 configurable: true // 是否可刪除屬性});// Object {get: function, set: function, enumerable: true, configurable: true}console.log(Object.getOwnPropertyDescriptor(obj, 'name')); obj.name = "111";console.log(obj.name);
2. Object.defineProperties()說明:此方法用來定義多個屬性。
var obj = {};Object.defineProperties(obj, { name: { value: "周華健", writable: true }, age: { value: 30, writable: true }, sex: { get: function(){ return this._sex; }, set: function(val){ if(val === 1){ this._sex = "男"; }else{ this._sex = "女"; } } }});obj.sex = 0;console.log(obj.sex); //女
JavaScript -- 理解對象的屬性