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