摘要:屬性描述對(duì)象何為屬性描述對(duì)象就是用來(lái)描述對(duì)象屬性的對(duì)象,其作用就是規(guī)定了屬性的行為,即擁有屬性和方法一共有個(gè)控制屬性的屬性在介紹前必須先熟悉操作和訪問屬性描述對(duì)象的方法此方法用于獲取自身繼承的不行,也就是不能越級(jí)屬性的屬性描述對(duì)象,兩個(gè)參數(shù)
屬性描述對(duì)象 何為屬性描述對(duì)象
就是用來(lái)描述對(duì)象屬性的對(duì)象,其作用就是規(guī)定了屬性的行為,即擁有屬性和方法 一共有6個(gè)控制屬性的屬性;在介紹前必須先熟悉操作和訪問屬性描述對(duì)象的方法Object.getOwnPropertyDescriptor()
此方法用于獲取自身(繼承的不行,也就是不能越級(jí))屬性的屬性描述對(duì)象,兩個(gè)參數(shù),第一個(gè)參數(shù)是目標(biāo)對(duì)象, 第二個(gè)參數(shù)是字符串,目標(biāo)對(duì)象的屬性名 ``` var obj = {name : 123}; obj.getOwnPropertyDescriptor(obj, "name"); //{value: 123, writable: true, //enumerable: true, configurable: true} ```Object.defineProperty(),Object.defineProperties()
Object.defineProperty()
Object.defineProperty(object, propertyName, attributesObject)用于設(shè)置一個(gè)屬性的屬性描述對(duì)象,
object:目標(biāo)對(duì)象
propertyName:目標(biāo)對(duì)象屬性
attributesObject:要設(shè)置的屬性描述對(duì)象
var obj = Object.defineProperty({}, "p", { value : "aaa", writable : false, enumerable : true, configurable : false, })
Object.defineProperties()
Object.defineProperties()可以一次性設(shè)置多個(gè)屬性的屬性描述對(duì)象
var obj ={}; Object.defineProperties(obj1, { a : {value : 123}, b : {value : 456, enumerable : true}, }) console.log(obj); //{b : 456, a : 123}Object.prototype.propertyIsEnumerable()
Object.prototype.propertyIsEumerable(elem),作用為該屬性是否可以枚舉,填入一個(gè)字符串,(值為屬性名),返回一個(gè)布爾值;這是一個(gè)實(shí)例方法
var obj = [1, 2]; obj.name = "arr"; obj.propertyIsEnumerable("name"); //true obj.propertyIsEnumerable("length"); //false obj.propertyIsEnumerable("0"); //true6大元屬性
能控制屬性的屬性稱為元屬性
value
設(shè)置該屬性的屬性值,默認(rèn)值為undefined
var obj = Object.defineProperty({}, "p", {value : 123}); obj["p"]; //123
writable
表示屬性值(value)外部能否直接賦值,writable是一個(gè)布爾值,默認(rèn)值是true
在用defineProperty()設(shè)置屬性時(shí),writable默認(rèn)值為fasle;同理enumerable,configurable也是如此
var obj = Object.defineProperty({}, "p", {value : 123}); Object.getOwnPropertyDescriptor(obj, "p"); //{ value: 123, writable: false, enumerable: false, configurable: false} var obj1 = {p :123}; Object.getOwnPropertyDescriptor(obj1, "p"); //{ value: 123, writable: true, enumerable: true, configurable: true}
如值為false,外部無(wú)法直接賦值改變
var obj = {a : 1}; Object.defineProperty(obj, "a", {writable : false}); obj.a = 2; console.log(obj.a); //1,嚴(yán)格模式下這么做會(huì)報(bào)錯(cuò)
enumerable
表示該屬性是否可以枚舉,即是否可以遍歷默認(rèn)是值為true,如值為false,則無(wú)法被for-in,JSON.stringify以及Object.keys()
var obj = { a : 1, b : 2, c : 3, }; Object.defineProperty(obj, "a", {enumerable: false}); for(var i in obj) { console.log(i); } //b //c
configurable
其值為布爾值,決定來(lái)是否可以修改屬性描述對(duì)象,也就是當(dāng)值為false時(shí),enumerable,configurable,這兩者不能再被修改,不然會(huì)報(bào)錯(cuò):TypeError
注意點(diǎn)
writable只有當(dāng)false改為true時(shí)會(huì)把錯(cuò),由true改為false時(shí)不會(huì)報(bào)錯(cuò)
var obj = Object.defineProperty({}, "a", { value : 123, //writable : false, writable : true enumerable : true, configurable : false, }); //Object.defineProperty(obj, "a", {writable : true}) 報(bào)錯(cuò) Object.defineProperty(obj, "a", {writable :false}); //可以修改
value值只有在writable和configurable至少一個(gè)為true時(shí)才能修改不然報(bào)錯(cuò)
configurable為false時(shí)則屬性不能被刪除
var obj = { a : 1, b : 2, }; Object.defineProperty(obj, "b", {configurable : false}); delete obj.a; delete obj.b; console.log(obj); //{b : 2}
get,set
get:取值,在對(duì)象取值時(shí)會(huì)跳用getter函數(shù),默認(rèn)值undefined,例如obj.a
set:存值,在對(duì)象賦值時(shí)會(huì)調(diào)用setter函數(shù),默認(rèn)值undefined,例如obj.a = 123;
注意點(diǎn):當(dāng)設(shè)置了set或者get元屬性時(shí),若設(shè)置了writable,或者設(shè)置value 屬性,會(huì)報(bào)錯(cuò):Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute,
var obj = Object.defineProperty({}, "a", { get : function () { return "getter" } set : function (value) { console.log(value); }, })
寫法2:
var obj = { get a() { return "getter"; }, set a(value) { console.log(value); } } obj.a = 123;控制對(duì)象的狀態(tài)
Object.preventExtensions:能刪除修改舊屬性,不能添加新屬性 Object.seal:不能刪除舊屬性,但能賦值修改舊屬性,不能添加新屬性,相當(dāng)于把configurable:false Object.freeze:不能刪除修改舊屬性,不能添加新屬性,相當(dāng)于對(duì)象變?yōu)槌A?/pre>var obj1 = {a : 1}; var obj2 = {a : 1}; var obj3 = {a : 1}; Object.preventExtensions(obj1); //舊屬性能刪除,能修改屬性對(duì)象value,能外部直接賦值 //obj1.a = 2; //delete obj1.a; //Object.defineProperty(obj1, "a", {value : 3}); //obj1.b = 2; //新屬性不能進(jìn)行賦值 //Object.defineProperty(obj1, "b", {value : 3}); //不能添加新的屬性描述對(duì)象,會(huì)保錯(cuò) Object.seal(obj2); //舊屬性不能刪除,能修改屬性對(duì)象value,能外部直接賦值 // obj2.a = 2; //delete obj2.a; // Object.defineProperty(obj2, "a", {value : 3}); //obj2.b = 2; //新屬性不能進(jìn)行賦值 //Object.defineProperty(obj2, "b", {value : 3}); //不能添加的新屬性描述對(duì)象,會(huì)保錯(cuò) Object.freeze(obj3); //舊屬性不能刪除,不能修改屬性對(duì)象value,不能外部直接賦值 obj3.a = 2; //delete obj3.a; //Object.defineProperty(obj3, "a", {value : 3}); //obj3.b = 2; //新屬性不能進(jìn)行賦值 //Object.defineProperty(obj3, "b", {value : 3}); //不能添加的新屬性描述對(duì)象,會(huì)保錯(cuò)注意點(diǎn):
凍結(jié)的是對(duì)象自身的屬性,但是可以通過給原型添加屬性來(lái)實(shí)現(xiàn)
var obj = {a :1}; Object.freeze(obj); console.log(obj.b); //undefined var obj0 = Object.getPrototypeOf(obj); obj0.b = 2; console.log(obj.b); //2
當(dāng)然我們可以凍結(jié)原型
var obj = {a :1}; Object.freeze(obj); console.log(obj.b); //undefined var obj0 = Object.getPrototypeOf(obj); Object.freeze(obj0); obj0.b = 2; console.log(obj.b); //undefined
但是對(duì)于屬性值為object類型的,我們凍結(jié)的是它的地址不變,但其內(nèi)容還是可以變得
var obj = {a :{b : 1}}; Object.freeze(obj); console.log(obj.a); //{b : 1} obj.a.b = 2; console.log(obj.a); //{b : 2} obj.a.c = 3; console.log(obj.a); //{b : 2, c : 3}三個(gè)檢測(cè)是否凍結(jié)的方法Object.isExtensible:能否為對(duì)象添加新屬性
Object.isSealed:是否使用了Object.seal()
Object.isFrozen:是否使用了Object.freeze()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98149.html
摘要:它不區(qū)分該屬性是對(duì)象自身的屬性,還是繼承的屬性。那么我們要遍歷對(duì)象所有屬性,包括繼承以及不可遍歷的屬性,用加原型遍歷實(shí)現(xiàn)類似的用遞歸 Object靜態(tài)方法 Object自身方法,必須由Object調(diào)用,實(shí)例對(duì)象并不能調(diào)用 Object.getPrototypeOf() 作用是獲取目標(biāo)對(duì)象的原型 function F() {}; var obj = new F(); console.lo...
摘要:繼承是面向?qū)ο缶幊陶Z(yǔ)言中的一個(gè)重要的概念,繼承可以使得子類具有父類的屬性和方法或者重新定義追加屬性和方法等。但是在中沒有類的概念,是基于原型的語(yǔ)言,所以這就意味著對(duì)象可以直接從其他對(duì)象繼承。 繼承是面向?qū)ο缶幊陶Z(yǔ)言中的一個(gè)重要的概念,繼承可以使得子類具有父類的屬性和方法或者重新定義、追加屬性和方法等。但是在Javascript中沒有類的概念,是基于原型的語(yǔ)言,所以這就意味著對(duì)象可以直接...
摘要:對(duì)象拷貝可遍歷屬性淺拷貝簡(jiǎn)單的淺拷貝可以用,對(duì)存取器定義的對(duì)象也試用深拷貝屬性描述對(duì)象的拷貝這是個(gè)淺拷貝深拷貝不可遍歷屬性對(duì)象的拷貝例如拷貝獲得共同的原型,與是兄弟關(guān)系說(shuō)明也繼承了原型,同級(jí)別簡(jiǎn)潔化版 對(duì)象拷貝 可遍歷屬性 淺拷貝 if(typeof Object.prototype.copy != function) { Object.prototype.copy = fun...
摘要:文中的多為構(gòu)造函數(shù)原型對(duì)象屬性為函數(shù)的專屬屬性,表示函數(shù)的原型對(duì)象。關(guān)于各種數(shù)據(jù)類型的屬性的展示對(duì)象的構(gòu)造器函數(shù)該屬性指向創(chuàng)建該對(duì)象原型的構(gòu)造函數(shù)。對(duì)對(duì)象的凍結(jié)狀態(tài)的設(shè)置和判斷,前者讓凍結(jié)對(duì)象,后者判斷對(duì)象是否被凍結(jié)。 前言 上篇文章介紹了JS的對(duì)象,本文將介紹Object這個(gè)基類,主要介紹其屬性和方法(其實(shí)這些在MDN里都有^_^,點(diǎn)擊這里可以直通MDN)。好了廢話不多說(shuō)了,直接開始...
摘要:命令作用作用是執(zhí)行構(gòu)造函數(shù),返回實(shí)例對(duì)象上面例子是自定義一個(gè)構(gòu)造函數(shù),其最大的特點(diǎn)就是首字母大寫,用執(zhí)行構(gòu)造函數(shù)其中,在的執(zhí)行下,代表了實(shí)例化后的對(duì)象,這個(gè)也就有屬性注意點(diǎn)如果不用執(zhí)行構(gòu)造函數(shù),那么指向的是全局有兩種方式可以避免內(nèi)部定義嚴(yán)格 new命令 new作用 作用是執(zhí)行構(gòu)造函數(shù),返回實(shí)例對(duì)象 function F() { this.name = object } var ...
閱讀 1367·2021-11-15 11:45
閱讀 3134·2021-09-27 13:36
閱讀 2878·2019-08-30 15:54
閱讀 995·2019-08-29 12:38
閱讀 2915·2019-08-29 11:22
閱讀 2996·2019-08-26 13:52
閱讀 2042·2019-08-26 13:30
閱讀 595·2019-08-26 10:37