国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

淺談JavaScript 數據屬性和訪問器屬性

2019-11-20 09:06:57
字體:
來源:轉載
供稿:網友

在JavaScript中對象被定義為"無序屬性的集合,其屬性可以包含基本值、對象或函數。"通俗點講,我們可以把對象理解為一組一組的名值對,其中值可以是數據或函數。

創建自定義對象通常有兩種方法,第一種就是創建一個Object的實例,然后再為其添加屬性和方法,例如:

var person = new Object(); person.name = "Scott"; person.age = 24; person.sayName = function(){   alert(person.name); } 

第二種方法即對象字面量法,一般推薦使用這種方法創建對象,例如:

var person = {   name: "Scott",   age: 24,   sayName: function(){      alert(this.name);    } } 

屬性類型

JavaScript中定義了兩種不同的屬性:數據屬性和訪問器屬性。數據屬性一般用于存儲數據數值,而訪問器屬性一般進行get/set操作,不能直接存儲數據數值。在ES5中,我們為了描述屬性(property)的各種特征,定義了特性(attribute)。在JavaScript中不能直接訪問特性,我們把它放在兩對方括號中,例如[[Enumerable]]。

•數據屬性

數據屬性主要有四個特性描述其行為:

1.[[Configurable]]:默認為true。表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性特性,或者能否把屬性修改為訪問器屬性;

2.[[Enumerable]]:默認為true。表示能否通過for-in循環返回屬性;

3.[[Writable]]:默認為true。表示能否修改屬性的值。

4.[[Value]]:默認值為undefined。表示包含屬性的數據值。讀寫屬性值都從這個位置進行。

對于上面直接在person對象上定義的屬性,它們的[[Configurable]]、[[Enumerable]]、[[Writable]]特性都被默認設置為true,而[[Value]]特性被設置為特定值。如果想要修改屬性默認的特性,可以使用ES5提供的Object.defineProperty()方法,這個方法接收三個參數:屬性所在對象、屬性的名字和一個描述符對象。描述符對象只能包含上述四個特性的一個或多個。例子如下:

var person = {   name: "Scott"} Object.defineProperty(person,"name",{   writable:false; })  console.log(person.name);  //"Scott" person.name = "Evan"; console.log(person.name);  //"Scott"

將person對象name屬性的特性writable設置為false,此屬性的值為不可修改的,因此對該屬性的復制操作會直接忽略。

var person = {   name: "Scott"} Object.defineProperty(person,"name",{   configurable:false; })  console.log(person.name);  //"Scott" delete person.name; console.log(person.name);  //"Scott" 

可以看到,當把name屬性的特性值configurable設置為false之后,就表示不能從對象中刪除屬性。但需要注意的是,當把屬性定義為不可配置之后,就不能把它變回可配置的了。此時修改除writable之外的其它特性都會報錯,例如:

var person = {   name: "Scott"} Object.defineProperty(person,"name",{   configurable:false; }) Object.defineProperty(person,"name",{   configurable:true;  //此處會拋出錯誤 }) 

也就是說,在把configurable特性修改為false之后,再修改其它特性就會有限制存在。

•訪問器屬性

訪問器屬性不包含數據值。它包含一對getter和setter函數。當讀取訪問器屬性時,會調用getter函數并返回有效值;當寫入訪問器屬性時,會調用setter函數并傳入新值,setter函數負責處理數據。該屬性有四個特性:

1.[[Configurable]]:默認為true。表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性特性,或者能否把屬性修改為訪問器屬性;

2.[[Enumerable]]:默認為true。表示能否通過for-in循環返回屬性;

3.[[Get]]:讀取屬性時調用的函數,默認為undefined;

4.[[Set]]:寫入屬性時調用的函數,默認為undefined。

訪問器屬性不能直接定義,必須通過Object.defineProperty()函數定義,例如:

var person = {   _name: "Scott",   _age: 24,   _tel: 86247 }; //name屬性為只讀的 Object.defineProperty(person,"name",{   get: function(){     return this._name;   } }); //age屬性為只寫不可讀的 Object.defineProperty(person,"age",{   set: function(p){      this._age = p;   } }); //tel屬性為可讀可寫的 Object.defineProperty(person,"tel",{   get:function(){      return this._tel;   },   set: function(p){      this._tel = p;   } }); console.log(person.name);  //"Scott" person.name = "Evan"; console.log(person.name);  //"Scott",對name屬性的修改無效 console.log(person.age);  //undefined,不可讀屬性 person.age = 25; console.log(person._age);  //25,已經修改 console.log(person.tel);  //"86247",可讀屬性 person.tel = "13975"; console.log(person.tel);  //"13975",可以修改

屬性前面的下劃線表示只能通過對象方法訪問的屬性。當我們使用person.name時實際上調用的是name屬性的getter函數,為person.name賦值時調用的是name屬性的setter函數,這樣屬性和訪問器之間的關系就很清晰了。

定義多個屬性

實際上ES5為我們提供了為一個對象定義多個屬性的方法,即Object.defineProperties(),該函數接收兩個參數,屬性所在的對象以及需要修改的屬性及其描述符對象組成的對象,例如把上邊的例子修改為一次性定義多個屬性,如下:

var person = {   _name: "Scott",   _age: 24,   _tel: 86247 }; Object.defineProperties(person,{   name:{     get: function(){       return this._name;     }   },   age:{     set: function(p){       this._age = p;     }   },   tel:{     get:function(){       return this._tel;     },     set: function(p){       this._tel = p;     }   } });

讀取屬性的特性

ES5提供了Object.getOwnPropertyDescripter()方法來獲取給定屬性的描述符。該方法接收兩個參數:屬性所在的對象和要讀取其描述符的屬性名稱。結果會返回一個對象,如果是訪問器屬性,返回的對象有configuable、enumerable、get和set;如果是數據屬性,這個返回對象的屬性包括configuable、enumerable、writable和value。對于上面的例如,使用如下:

var person = {   _name: "Scott",   _age: 24,   _tel: 86247 }; Object.defineProperties(person,{   name:{     get: function(){       return this._name;     }   },   age:{     set: function(p){       this._age = p;     }   },   tel:{     get:function(){       return this._tel;     },     set: function(p){       this._tel = p;     }   } }); var descripter = Object.getOwnPropertyDescripter(person,"tel"); console.log(descripter.value);  //undefined console.log(descripter.enumerable);  //false console.log(typeof descripter.get);  //"function"

上面的代碼中獲取了person對象的tel屬性,由于其是一個訪問器屬性,所以其value為undefined,enumerable為false,而get為指向getter函數的一個指針。

以上這篇淺談JavaScript 數據屬性和訪問器屬性就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 全南县| 香港| 桂东县| 哈巴河县| 牙克石市| 岫岩| 武汉市| 巴塘县| 新津县| 吉安县| 武鸣县| 永仁县| 托克托县| 临潭县| 辰溪县| 偃师市| 沙河市| 北流市| 灵丘县| 齐河县| 民勤县| 屯昌县| 广西| 突泉县| 平泉县| 宣武区| 天津市| 绥宁县| 长顺县| 清新县| 毕节市| 桂平市| 河北省| 金华市| 噶尔县| 土默特右旗| 库车县| 汾阳市| 利津县| 衢州市| 广宗县|