摘要:決定該屬性是否可重新設(shè)置描述符。此時(shí),屬性的描述符被稱為訪問描述符。屏蔽屬性當(dāng)你給一個(gè)對(duì)象賦值一個(gè)新的屬性時(shí),如果該對(duì)象的原型鏈上已存在屬性,并且被標(biāo)記為只讀時(shí),嚴(yán)格模式下會(huì)拋出異常,非嚴(yán)格模式下,這條賦值語(yǔ)句會(huì)被忽略。
屬性描述符
在ES5開始,所有屬性都具備了屬性描述符。
我們可以通過Object.getOwnPropertyDescriptor來觀察到屬性的描述符,它是長(zhǎng)這樣子的。
Object.getOwnPropertyDescriptor({a: 1}, "a"); // { // value: 1, // writable: true, // enumerable: true, // configurable: true // }
writable決定該屬性是否只讀。
enumerable決定該屬性是否可枚舉。
configurable決定該屬性是否可重新設(shè)置描述符。
當(dāng)屬性的configurable為true時(shí),我們可以通過Object.defineProperty來修改屬性描述符。
"use strict"; var foo = {a: 1}; for(var i in foo) {console.log(i)}; // "a" Object.defineProperty(foo, "a", { writable: false, enumerable: false, configurable: false }); foo.a = 2;// Uncaught TypeError: Cannot assign to read only property "a" of object "#訪問描述符(getter和setter)
getter和setter有兩種方式定義
字面量定義
var foo = { get a(){ return this._a; }, set a(value){ this._a = value; } };
使用Object.defineProperty定義
var foo = {a: 1}; Object.defineProperty( foo, "a", { get(){ return this._a; }, set(value){ this._a = value; } } );
這個(gè)時(shí)候再看看屬性a的描述符。
Object.getOwnPropertyDescriptor(foo, "a") // { // get: ? a(), // set: ? a(value), // enumerable: true, // configurable: true // }
當(dāng)出現(xiàn)getter或setter時(shí),value和writable就會(huì)失效。
此時(shí),屬性a的描述符被稱為訪問描述符。
訪問描述符和屬性描述符互斥,如果此時(shí)再重新設(shè)置value或者writable描述符,setter和getter也會(huì)被丟棄。
當(dāng)你給一個(gè)對(duì)象賦值一個(gè)新的屬性foo時(shí),如果該對(duì)象的原型鏈上已存在屬性foo,并且foo被標(biāo)記為只讀(writable: false)時(shí),嚴(yán)格模式下會(huì)拋出異常,非嚴(yán)格模式下,這條賦值語(yǔ)句會(huì)被忽略。這種屬性稱為屏蔽屬性。
舉個(gè)例子
"use strict"; var anotherObject = {}; Object.defineProperty(anotherObject, "foo", {// 將anotherObject的foo屬性設(shè)為只讀 value: 1, writable: false }); var myObject = Object.create(anotherObject);// 將myObject的原型設(shè)置為anotherObject console.log(myObject);// {} console.log(myObject.foo);// 1 myObject.foo = 2;// Uncaught TypeError: Cannot assign to read only property "a" of object "#
還有一種情況
當(dāng)你給一個(gè)對(duì)象賦值一個(gè)新的屬性foo時(shí),如果該對(duì)象的原型鏈上已存在屬性foo,并且foo被設(shè)置了setter時(shí),將會(huì)調(diào)用這個(gè)setter,并且該賦值語(yǔ)句將會(huì)被忽略,此時(shí)也會(huì)發(fā)生屬性屏蔽。
var anotherObject = {}; Object.defineProperty(anotherObject, "foo", {// 給anotherObject的foo屬性設(shè)置setter set(value) { console.log(value); this._foo = value; }, get() { return this._foo; } }); var myObject = Object.create(anotherObject);// 將myObject的原型設(shè)置為anotherObject myObject.foo = 2;// 此時(shí)會(huì)觸發(fā)anotherObject.foo的setter,控制臺(tái)輸出2 console.log(Object.hasOwnProperty(myObject, "foo"));// false解決方案
使用Object.defineProperty來添加屬性。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/100257.html
摘要:不像其他屬性,描述符在類級(jí)別上創(chuàng)建。當(dāng)所有者類被定義時(shí),每個(gè)描述符對(duì)象都是被綁定到一個(gè)不同的類級(jí)別屬性的描述符類實(shí)例。這必須返回描述符的值。此外,描述符對(duì)有一個(gè)方便的響應(yīng)和請(qǐng)求格式。 注:原書作者 Steven F. Lott,原書名為 Mastering Object-oriented Python __getattribute__()方法 __getattribute__()方法是...
摘要:下面我們用描述符來實(shí)現(xiàn)中的動(dòng)態(tài)屬性和特性中提及的訂單結(jié)算代碼第四版使用描述符實(shí)現(xiàn)訂單結(jié)算功能描述符基于協(xié)議實(shí)現(xiàn),無需創(chuàng)建子類。特性是覆蓋型描述符。非覆蓋型描述符沒有實(shí)現(xiàn)方法的描述符屬于非覆蓋型描述符。類中定義的方法是非覆蓋型描述符。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之元編程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、了解描述符...
摘要:所以搞清楚是理解對(duì)象屬性描述符的唯一途徑。是一個(gè)對(duì)象,對(duì)象里的屬性描述符有兩種類型數(shù)據(jù)描述符和存取描述符。描述符必須是這兩種形式之一不能同時(shí)是兩者。描述符中未顯示設(shè)置的特性使用其默認(rèn)值。創(chuàng)建一個(gè)新屬性默認(rèn)描述符的鍵值都是或者。 對(duì)象屬性描述符 當(dāng)別人對(duì)你提及對(duì)象屬性描述符,可能會(huì)蒙逼。而如果提及對(duì)象屬性的 get/set 方法就秒懂了,標(biāo)準(zhǔn)描述和習(xí)慣表述在這里有些差別,但是指向的是同一...
摘要:之所以是這樣是因?yàn)楫?dāng)訪問一個(gè)實(shí)例描述符對(duì)象時(shí),會(huì)將轉(zhuǎn)換為。而類的字典中則有描述符對(duì)象。這主要就是因?yàn)槊枋龇麅?yōu)先。此外,非數(shù)據(jù)描述符的優(yōu)先級(jí)低于實(shí)例屬性。參考以上就是本人對(duì)描述符的一些理解,有什么不正確的地方還請(qǐng)不吝指出,謝謝 什么是描述符 python描述符是一個(gè)綁定行為的對(duì)象屬性,在描述符協(xié)議中,它可以通過方法重寫屬性的訪問。這些方法有 __get__(), __set__(), 和...
摘要:默認(rèn)為當(dāng)該屬性的為時(shí),才能被賦值運(yùn)算符改變??梢允侨魏斡行У闹禂?shù)值,對(duì)象,函數(shù)等。而這些篡改可能會(huì)影響對(duì)象的內(nèi)置屬性或方法,從而導(dǎo)致對(duì)象的正常功能可能無法使用。 屬性描述符 JavaScript提供了一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu),用于描述對(duì)象的值,控制其行為,例如該屬性是否可寫、是否可配置、是否可修改以及是否可枚舉等。這個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)被稱為‘屬性描述符’。每個(gè)屬性都有自己對(duì)應(yīng)的屬性描述符,保存該屬...
閱讀 720·2023-04-25 17:54
閱讀 2976·2021-11-18 10:02
閱讀 1139·2021-09-28 09:35
閱讀 655·2021-09-22 15:18
閱讀 2857·2021-09-03 10:49
閱讀 3057·2021-08-10 09:42
閱讀 2580·2019-08-29 16:24
閱讀 1262·2019-08-29 15:08