摘要:作用修改屬性默認的特性參數屬性所在的對象屬性的名字和一個描述符對象。描述符對象的屬性必須是和。這個方法接收兩個參數屬性所在的對象和要讀取器描述符的屬性名稱。
屬性的類型
ECMA-262 第 5 版在定義只有內部才用的特性(attribute)時,描述了屬性(property)的各種特征。定義這些屬性是為了實現JavaScript引擎用的,因此在JavaScript中不能直接訪問它們。為了我表示特性是內部值,改規范把它們放在了兩對兒方括號中,例如[[Enumerable]]。
ECMAScript 中有兩種屬性:數據屬性和訪問器屬性
1.數據屬性數據屬性包含一個數據值的位置。在這個位置可以讀取和寫入值。數據屬性有 4 個描述其行為的特性。
[[Configurable]]:表示能否通過 delete 刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。直接在對象上定義的屬性,它們的這個特性默認值為 true。
[[Enumerable]]:表示能否通過 for-in 循環返回屬性。直接在對象上義的屬性,它們的這個特性默認值為 true。
[[Writable]]:表示能否修改屬性的值。直接在對象上定義的屬性,它們的這個特性默認值為 true。
[[Value]]:包含這個屬性的數據值。讀取屬性值的時候,從這個位置讀;寫入屬性值的時候,新值保存在這個位置。這個特性的默認值為 undefined。
Object.defineProperty()作用:修改屬性默認的特性
參數:屬性所在的對象、屬性的名字、和一個描述符對象。描述符對象的屬性必須是configurable、enumerable、writable 和 value。
Object.defineProperty(person, "name", { writable: false, value: "Nicholas" }); alert(person.name); //"Nicholas" person.name = "Greg"; alert(person.name); //"Nicholas"
一旦把configurable屬性定義為不可配置的,就不能再把它變回可配置了。此時,再調用 Object.defineProperty()方法修改除 writable 之外
的特性,都會導致錯誤
var person = {}; Object.defineProperty(person, "name", { configurable: false, value: "Nicholas" }); //拋出錯誤 Object.defineProperty(person, "name", { configurable: true, value: "Nicholas" });
在調用 Object.defineProperty()方法時,如果不指定,configurable、enumerable 和writable 特性的默認值都是 false(未調用改方法時默認值都為true)
2. 訪問器屬性訪問器屬性不含數據值;他們包含一對兒getter和setter函數(不是必需的)。在讀取訪問器屬性時,會調用getter函數,這個函數負責返回有效的值;在寫入訪問器屬性時,會調用setter函數并傳入新值。這個函數負責如何處理數據
訪問器的四個屬性:
[[Configurable]]:表示能否通過 delete 刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為數據屬性。對于直接在對象上定義的屬性,這個特性的默認值為true。
[[Enumerable]]:表示能否通過 for-in 循環返回屬性。對于直接在對象上定義的屬性,這個特性的默認值為 true。
[[Get]]:在讀取屬性時調用的函數。默認值為 undefined。
[[Set]]:在寫入屬性時調用的函數。默認值為 undefined。
訪問器屬性不能直接定義,必須使用 Object.defineProperty()來定義。
var book = { _year: 2004, //下劃線是一種常用的記號,用于表示只能通過對象方法訪問的屬性 edition: 1 }; Object.defineProperty(book, "year", { get: function(){ return this._year; }, set: function(newValue){ if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } }); book.year = 2005; alert(book.edition); //2
支持 ECMAScript 5 的這個方法的瀏覽器有 IE9+(IE8 只是部分實現)、Firefox 4+、Safari 5+、Opera 12+ 和 Chrome 。在這個方法之前,要創建訪問器屬性,一般都使用兩個非標準的方法:__defineGetter__()和__defineSetter__()。這兩個方法最初是由 Firefox 引入的,后來 Safari 3、Chrome 1 和 Opera 9.5 也給出了相同的實現
var book = { _year: 2004, edition: 1 }; //定義訪問器的舊有方法 book.__defineGetter__("year", function(){ return this._year; }); book.__defineSetter__("year", function(newValue){ if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } }); book.year = 2005; alert(book.edition); //2 AccessorPropertiesExample02.htm 在不支持 Object.defineProperty() 方法的瀏覽器中不能修改 [[Configurable]] 和 [[Enumerable]]。2 定義多個屬性
Object.defineProperties()方法,利用這個方法可以通過描述符一次定義多個屬性。這個方法接收兩個對象參數:第一個對象是要添加和修改器屬性的對象,第二個對象的屬性和第一個對象中要添加或修改的屬性一一對象。
var book = {}; Object.defineProperties(book, { _year: { value: 2004 }, edition: { value: 1 }, year: { get: function(){ return this._year; }, set: function(newValue){ if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } } });3 讀取屬性的特性
Object.getOwnPropertyDescriptor()方法,可以取得給定屬性的描述符。這個方法接收兩個參數: 屬性所在的對象和要讀取器描述符的屬性名稱。返回值是一個對象,如果是訪問器屬性,這個對象的屬性有configurable、enumerable、get 和 set;如果是數據屬性,這個對象的屬性有 configurable、enumerable、writable 和 value。
var book = {}; Object.defineProperties(book, { _year: { value: 2004 }, edition: { value: 1 }, year: { get: function(){ return this._year; }, set: function(newValue){ if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } } }); var descriptor = Object.getOwnPropertyDescriptor(book, "_year"); alert(descriptor.value); //2004 alert(descriptor.configurable); //false
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/103465.html
摘要:對象是屬性的無序集合。使用對象直接量創建的對象的原型就是,使用運算符創建的對象的原型是構造函數的的值。主要目的是將對象鎖定,避免外界干擾。判斷對象是否封閉。刪除屬性可刪除對象的自有屬性且為的屬性。 對象是屬性的無序集合。因此,這一章主要從對象和屬性兩個方面來闡述。showImg(https://box.worktile.com/view/c8f5f376fe314aeca69d9b4c...
摘要:但好在還給我們提供了一個方法,每一個對象都有這樣一個方法,專門用來判斷某個屬性是否是該對象的私有屬性。如果你想要用對象字面形式,你只能在創建對象時定義訪問器屬性。在中,我們使用凍結一個對象,并且使用來判斷一個對象是否被凍結。 說完了對象那些不常用的冷知識,是時候來看看JavaScript中對象屬性有哪些有意思的東西了。 不出你所料,對象屬性自然也有其相應的特征屬性,但是這個話題有點復雜...
摘要:通過對返回字符串切片第位到倒數第位即可獲得對象的類型。測試對象是的深拷貝是的子集,不能表示中所有值。序列化結果是,對象序列化結果是日期字符串不能表示函數對象和只能序列化對象自有的可枚舉屬性。 對象 對象是JavaScript的基本數據類型:屬性的無序集合。每個屬性key: value和屬性描述符descripter組成。 屬性名key:字符串或合法的變量標識符; 屬性值value:...
摘要:盡管的右操作數是構造函數,但計算過程實際是檢測了對象的繼承關系。通過創建的對象使用構造函數的屬性作為它們的原型。 JavaScript之對象屬性 Object.create()繼承 ECMAScript 5定義了一個名為Object.create()的方法,它創建一個新對象, 其中第一個參數是這個對象的原型。Object.create()提供第二個可選參數,用以對對象的屬性進行進一步描...
摘要:屬性名可以是包含空字符串在內的任意字符串,但對象中不能存在兩個同名的屬性。客戶端中表示網頁結構的對象均是宿主對象。這里的函數稱做構造函數,構造函數用以初始化一個新創建的對象。通過關鍵字和構造函數調用創建的對象的原型就是構造函數的屬性的值。 對象是 JavaScript 的數據類型。它將很多值(原始值或者其他對象)聚合在一起,可通過名字訪問這些值,因此我們可以把它看成是從字符串到值的映射...
摘要:對象是什么在中,一個對象就像一個單獨擁有屬性和類型的實體。一個杯子作為一個對象,杯子有顏色重量等屬性。同樣,對象也有屬性定義它的特征。方法是關聯到某個對象的函數,或者說,一個方法是一個值為某個函數的對象屬性。 對象是什么 在JavaScript中,一個對象就像一個單獨擁有屬性和類型的實體。一個杯子作為一個對象,杯子有顏色、重量等屬性。同樣,JavaScript對象也有屬性定義它的特征。...
閱讀 2265·2021-09-27 13:35
閱讀 561·2019-08-30 15:55
閱讀 810·2019-08-30 15:53
閱讀 555·2019-08-30 15:52
閱讀 2146·2019-08-30 12:59
閱讀 2269·2019-08-29 16:42
閱讀 1385·2019-08-26 18:26
閱讀 2467·2019-08-26 13:48