摘要:存取器屬性的個特性是讀取寫入可枚舉性和可配置性。描述符對象的屬性和他們所描述符的屬性特性是同名的。通過調(diào)用可以獲得某個對象特定屬性的描述符只能得到自有屬性的描述符。對于新創(chuàng)建的屬性來說,默認的特性值是或。
除了包含名字和值之外,屬性還包含的一些標(biāo)識它們可寫、可枚舉和可配置的特性。數(shù)據(jù)屬性的4個特性分別是它的值(value)、可寫性(writable)、可枚舉性(enumerable)和可配置性(configurable)。存取器屬性的4個特性是讀?。╣et)、寫入(set)、可枚舉性和可配置性。
可寫性決定屬性的值是否可以被改變
可配置性決定了是否可以修改屬性描述對象
ECMAScript中有一個名為“屬性描述符”(property descriptor)的對象,這個對象代表那4個特性。描述符對象的屬性和他們所描述符的屬性特性是同名的。因此數(shù)據(jù)屬性的描述符對象有value、writable、enumerable和configurable。存取器屬性的描述符對象則用get屬性和set屬性代替value和writable。其中writable、enumerable和configurable是布爾值,get屬性和set屬性是函數(shù)值。
Object.getOwnPropertyDescriptor()通過調(diào)用Object.getOwnPropertyDescriptor()可以獲得某個對象特定屬性的描述符:
Object.getOwnPropertyDescriptor({x:1},"x"); //{value:1,writable:true,enumerable:true,configurable:true}
Object.getOwnPropertyDescriptor()只能得到自有屬性的描述符。
Object.defineProperty()與Object.defineProperties()要想設(shè)置屬性的特性,或者想讓新建屬性具有某種特性,則需要調(diào)用Object.defineProperty(),傳入要修改的對象,要創(chuàng)建或要修改的屬性,以及屬性描述符對象。
var o = {}; // 添加一個不可枚舉的數(shù)據(jù)屬性x,并賦值為1 Object.defineProperty(o, "x", { value:1, writable: true, enumerable:false, configurable: true});
傳入Object.defineProperty()的屬性描述符對象不必包含4個特性。對于新創(chuàng)建的屬性來說,默認的特性值是false或undefined。對于修改的已有屬性來說,默認的特性值沒有做任何修改。這個方法要么修改已有屬性要么新建自有屬性,但不能修改繼承屬性。
如果要同時修改或創(chuàng)建多個屬性,則需要使用Object.defineProperties()。第一個參數(shù)是要修改的對象,第二個參數(shù)是一個映射表,它包含要新建或修改的屬性的名稱,以及它們的屬性描述符,例如:
var p = Object.defineProperties( x: { value:1, writable: true, enumerable:false, configurable: true}, y:{ value:1, writable: true, enumerable:false, configurable: true}, r: { get: function() { return Math.sqrtthis.x*this.x + this.y*this.y) }, enumerable:false, configurable: true } });
用Object.defineProperty()與Object.defineProperties()操作對象屬性的特性也是要遵循一定的規(guī)則的。任何違反規(guī)則的使用會拋出類型錯誤異常。下面是完整的規(guī)則:
如果對象是不可擴展的,則可以編輯已有的自有屬性,但不能給它添加新屬性。
如果屬性是不可配置的,則不能修改它的可配置性和可枚舉性。
如果存取器屬性是不可配置的,則不能修改其getter和setter方法,也不能將它轉(zhuǎn)換為數(shù)據(jù)屬性。
如果數(shù)據(jù)屬性是不可配置的,則不能將它轉(zhuǎn)換成存取器屬性。
如果數(shù)據(jù)屬性是不可配置且不可寫的,則不能修改它的值。然而可配置但不可寫屬性的值是可以修改的(實際上是先將它標(biāo)記為可寫的,然后修改它的值,最后轉(zhuǎn)換為不可寫的)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/89265.html
摘要:深入理解中的屬性和特性中屬性和特性是完全不同的兩個概念,這里我將根據(jù)自己所學(xué),來深入理解中的屬性和特性。其中第三個參數(shù)描述符對象是對象字面量的方法創(chuàng)建的,里面的屬性和屬性值實際上保存的是要修改的特性和特性值。 深入理解JavaScript中的屬性和特性 JavaScript中屬性和特性是完全不同的兩個概念,這里我將根據(jù)自己所學(xué),來深入理解JavaScript中的屬性和特性。 主...
摘要:特性本文將簡單列舉的核心特性。獲取自有屬性名列表。以給丁對象為創(chuàng)建新的對象并返回。將對象的每個自有自有屬性做如下操作屬性的特性置為屬性的特性置為同時,該對象將不可擴展。檢查對象是否是位于給定對象的原型鏈上。 原文: http://pij.robinqu.me/JavaScript_Core/ECMAScript/es5.html 源代碼: https://github....
摘要:面向?qū)ο蟮某绦蛟O(shè)計理解對象前言最近在細讀高級程序設(shè)計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下??偨Y(jié)如果英語水平足夠好的話,建議看英文原版書籍或者國外大師的博客。 JS面向?qū)ο蟮某绦蛟O(shè)計_理解對象 前言:最近在細讀Javascript高級程序設(shè)計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下。 如有紕漏或錯誤,會非...
摘要:上一篇面向?qū)ο蟀鎵K之理解對象下一篇面向?qū)ο蟀鎵K之定義多個對象屬性以及讀取屬性特性 這是 javascript 面向?qū)ο蟀鎵K的第二篇文章,主要講解的是對象的屬性,首先創(chuàng)建一個對象: var person = { name: Nicholas, age: 29, job: Software Engineer, sayName: function () { conso...
摘要:返回值是一個對象,如果是訪問器屬性,這個對象的屬性有和如果是數(shù)據(jù)屬性,這個對象的屬性有和。上一篇面向?qū)ο蟀鎵K之對象屬性下一篇面向?qū)ο蟀鎵K之創(chuàng)建對象 這是 javascript 面向?qū)ο蟀鎵K的第三篇文章,主要講解的是多個屬性的定義以及讀取屬性的特性。前面這幾章內(nèi)容目的在于加深對對象的理解,這樣可以利于理解后面的原型鏈以及繼承方面的知識,或者你也可以了解一下不一樣的 javascript ...
閱讀 1626·2021-11-17 09:33
閱讀 1202·2021-11-12 10:36
閱讀 2481·2019-08-30 15:54
閱讀 2487·2019-08-30 13:14
閱讀 2980·2019-08-26 14:05
閱讀 3345·2019-08-26 11:32
閱讀 3074·2019-08-26 10:09
閱讀 3066·2019-08-26 10:09